Как скопировать файл в контейнер и из него
С хоста в контейнер:
docker cp ./index.html web:/usr/share/nginx/html/index.htmlИз контейнера на хост:
docker cp web:/etc/nginx/nginx.conf ./nginx.confweb — имя или идентификатор контейнера; между именем и путём внутри контейнера — двоеточие. Контейнер может быть и работающим, и остановленным.
Папки
docker cp web:/etc/nginx/conf.d ./conf.d
docker cp ./site/. web:/usr/share/nginx/html/Правила как у cp -a:
- если папки назначения нет, она создаётся, и в неё копируется содержимое исходной папки;
- если папка назначения есть, исходная папка копируется внутрь неё (получится
html/site); /.в конце исходного пути — скопировать именно содержимое, а не саму папку. Так во втором примере файлы из./siteпопадают прямо вhtml.
Родительские папки назначения docker cp не создаёт: копирование в web:/no/such/dir/file.txt закончится ошибкой.
Владелец файлов
Файлы, скопированные в контейнер, получают владельца root. Если программа в контейнере работает от другого пользователя и должна менять файл, поправьте владельца:
docker exec -u root web chown nginx:nginx /usr/share/nginx/html/index.htmlФайлы, скопированные из контейнера, принадлежат пользователю, который выполнил docker cp.
В Docker Compose
docker compose cp ./index.html web:/usr/share/nginx/html/index.htmlЗдесь web — имя сервиса из compose.yaml, а не контейнера.
Подводные камни
Файл, скопированный внутрь контейнера, лежит в его слое для записи. При пересоздании контейнера — обновлении образа, docker compose up -d после правки, docker rm — он пропадёт. Для файлов, которые должны жить долго (настройки, сайт, данные), подключайте папку или том: -v ./site:/usr/share/nginx/html:ro.
docker cpудобен для разовых дел: достать лог или файл настроек по умолчанию, чтобы взять его за основу, положить исправление на время проверки.- Скопировать файл напрямую между двумя контейнерами нельзя — только через хост: сначала из одного, потом в другой.
- Программа в контейнере может не заметить новый файл настроек, пока её не перезапустить:
docker restart web(у Nginx хватитdocker exec web nginx -s reload).