Команда docker cp: как скопировать файл из сервера внутрь контейнера и обратно
Когда требуется прямое копирование файлов через docker cp
При работе с Docker файлы внутри контейнера изолированы от основной файловой системы сервера хоста. Однако системным администраторам регулярно требуется экстренно скопировать конфигурационный файл из контейнера для редактирования, вытащить свежий дамп базы данных (dump.sql), залить лицензионный ключ или выгрузить логи упавшего приложения. Утилита docker cp позволяет копировать файлы и целые папки «на лету» без остановки контейнера и без настройки постоянных томов (Volumes).
Главное правило синтаксиса docker cp
Команда строится точно так же, как стандартная утилита cp:
docker cp [ОТКУДА] [КУДА]
Пошаговые примеры копирования файлов и папок
Сценарий 1: Копирование файла ИЗ контейнера на хост-сервер Linux
Выгрузим конфигурационный файл Nginx из работающего контейнера в текущую папку на сервере:
docker cp my-nginx-container:/etc/nginx/nginx.conf ./nginx.conf(Синтаксис: имя_контейнера:путь_внутри_контейнера путь_на_хосте).
Сценарий 2: Копирование файла С хоста ВНУТРЬ работающего контейнера
Зальем отредактированный файл конфигурации обратно внутрь контейнера:
docker cp ./nginx.conf my-nginx-container:/etc/nginx/nginx.confПосле копирования примените настройки внутри контейнера без его остановки: docker exec my-nginx-container nginx -s reload.
Сценарий 3: Выгрузка дампа базы данных из контейнера MySQL
Выгрузим файл дампа базы на жесткий диск сервера:
docker cp mysql-server:/tmp/database_backup.sql /backup/database_backup.sqlСценарий 4: Копирование папки целиком (со всеми вложенными файлами)
Скопируем папку с картинками сайта из контейнера на хост:
docker cp my-web-app:/var/www/html/uploads /home/ubuntu/site_uploadsТиповые ошибки администраторов
- Копирование в несуществующую папку на хосте: Если целевой директории на сервере не существует, Docker создаст файл с именем этой папки вместо копирования внутрь нее. Всегда создавайте целевую папку заранее через
mkdir -p. - Сброс прав доступа на скопированных файлах: Файлы, скопированные на хост командой
docker cp, получают владельцем пользователяroot. Если обычному пользователю нужен доступ к файлу, измените владельца:sudo chown $USER:$USER ./copied_file.conf.
Инженеры ITSTM спроектируют архитектуру постоянных томов (Docker Volumes / Bind Mounts / NFS), исключающую необходимость ручного копирования файлов.
Частые вопросы (FAQ)
Можно ли использовать docker cp, если контейнер остановлен (Stopped)?
Да! Команда docker cp отлично работает как с запущенными, так и с полностью остановленными контейнерами, что спасает при аварийном извлечении данных.
Можно ли скопировать файл напрямую из одного контейнера в другой?
Напрямую нельзя. Копирование выполняется в два этапа: сначала из первого контейнера на хост-сервер, затем с хоста во второй контейнер (либо через pipe: docker cp c1:/file - | docker cp - c2:/path).
Работает ли docker cp с символическими ссылками (Symlinks)?
По умолчанию docker cp следует по символическим ссылкам и копирует реальный целевой файл. Для копирования самой ссылки используйте флаг -L (follow link).
Как узнать точный путь к файлу внутри контейнера?
Подключитесь внутрь контейнера через интерактивный терминал: docker exec -it имя_контейнера sh (или bash) и найдите путь командой 'pwd' или 'find'.