Поиск по сайту:

Как использовать Docker Cp для копирования файлов между хостом и контейнерами


Нужно загрузить некоторые файлы в контейнер Docker или из него? Команда docker cp позволяет копировать между файловыми системами хоста и контейнера, чтобы вы могли добавлять детали конфигурации, создавать резервные копии и восстанавливать существующие данные.

Базовый синтаксис

docker cp принимает исходный и целевой пути в качестве двух аргументов:

docker cp example.txt my-container:/example.txt

Здесь example.txt копируется из вашего рабочего каталога в /example.txt в контейнере my-container. Вы можете поменять местами два аргумента, чтобы скопировать /example.txt из контейнера в ваш рабочий каталог.

Аргумент, ссылающийся на путь к контейнеру, должен начинаться с идентификатора или имени контейнера, за которым следует двоеточие (:). Вы можете найти идентификатор или имя запущенного контейнера с помощью docker ps.

Для каждой команды docker cp требуется один путь к локальной файловой системе и один путь к контейнеру — вы не можете напрямую копировать между двумя контейнерами. Используйте многоэтапную процедуру, если вам нужно сделать это, скопировав сначала из исходного контейнера в вашу файловую систему, а затем из нового локального пути в целевой контейнер.

Копирование целых каталогов

docker cp также может рекурсивно копировать каталоги:

docker cp /home/demo/website apache-container:/var/www/html/.

Docker скопирует все в /home/demo/website и перенесет в /var/www/html.

Копировать поведение

Когда вы копируете файл, Docker создает новый файл в месте назначения, если он еще не существует. Существующие файлы перезаписываются новым содержимым. Когда место назначения является каталогом, файл копируется в него с использованием имени исходного файла. Исключением является случай, когда указанный пункт назначения заканчивается символом /, обозначающим каталог, но путь еще не существует. В этом случае будет вызвана ошибка.

Процесс немного сложнее для копий каталогов. В месте назначения будет создан новый каталог с содержимым исходного каталога, если путь назначения еще не существует. Когда он существует, поведение отличается в зависимости от того, включили ли вы завершающий компонент /. в путь.

  • /. присутствует — исходный каталог копируется в существующий целевой каталог.
  • /. отсутствует — содержимое исходного каталога копируется в место назначения.

Тонкое различие определяет, создается ли новый подкаталог внутри места назначения.

Ограничения команды

Несмотря на свое название, docker cp не является полной реализацией команды оболочки cp. Флаги cp не поддерживаются, за исключением -a и -L:

  • -a — архивный режим, который сохраняет сведения о пользователях и группах в скопированных файлах.
  • -L — переходите по символическим ссылкам в исходном каталоге, чтобы копировать содержимое целевых ссылок, а не сами ссылки.

Для более сложных случаев использования, когда требуется выборочное копирование, вам нужно будет использовать другой подход.

Использование Bind Mounts для копирования файлов

Тома Docker предоставляют еще один способ перемещения файлов между контейнерами и вашим хостом. Привязка локального каталога к контейнеру позволяет получить доступ к его содержимому из файловой системы хоста, избавляя от необходимости использовать docker cp.

docker run -v /example/host/directory:/container/path my-image:latest

Содержимое пути /example/host/directory монтируется в файловую систему контейнера по адресу /container/path. Вы можете взаимодействовать с этими файлами за пределами Docker, используя знакомые инструменты, такие как cp, rsync и ваш графический файловый браузер.

Этот метод полезен только тогда, когда вы работаете с одним каталогом контейнера. Это не работает, когда вы копируете из произвольных мест, так как вам нужно заранее знать пути, которые вы будете использовать, при создании контейнера.

Вы также должны быть осторожны с разрешениями файловой системы: файлы, созданные в контейнере, обычно будут принадлежать root. Это может создать неудобные сценарии на хосте, где вы не можете редактировать или удалять файлы внутри связанного каталога. Используйте команду chown на хосте и внутри контейнера, чтобы при необходимости переключить владельца в зависимости от среды.

Как насчет COPY в Dockerfiles?

docker cp иногда можно спутать с инструкцией COPY в Dockerfiles. Важно понимать, что эти две функции служат совершенно разным вариантам использования.

COPY нельзя использовать для перемещения файлов между вашим хостом и работающим контейнером. Он предназначен для загрузки файлов в images в процессе сборки:

COPY /home/me/my-website /var/www/html/.

Здесь исходный код веб-сайта копируется в изображение как часть сборки. Это одноразовый процесс. Каждый контейнер, запущенный из образа, будет включать исходный код веб-сайта, каким он был на момент запуска docker build.

docker cp позволяет заменить этот исходный код более новой версией после запуска контейнера. Инструкции COPY предназначены для того, чтобы сделать файлы частью статического изображения; Команды cp взаимодействуют с живыми контейнерами.

Когда копировать файлы с помощью Docker?

Копирование файлов вручную с вашего хоста в контейнер Docker или наоборот должно быть относительно редким явлением. Образы должны быть самодостаточными, поэтому они должны содержать все необходимое для запуска экземпляра. Конфигурация обычно обрабатывается через переменные среды.

Контейнеры, которым необходимо постоянно хранить данные, должны использовать тома Docker. Тома позволяют данным существовать дольше любого отдельного контейнера, поэтому вам не нужно вручную docker cp перед заменой экземпляра. Когда вы делаете резервные копии, копируйте тома со своего хоста, а не извлекайте файлы из контейнеров.

docker cp наиболее полезен при отладке контейнеров или работе в среде разработки. Иногда вам нужно вручную внедрить временный файл конфигурации или вытащить скрытый журнал. Использование docker cp быстрее и удобнее, чем перестраивать весь образ каждый раз, когда вы вносите изменения в код.

Всегда помните, что файлы, скопированные в контейнеры, будут сохраняться только до тех пор, пока существует контейнер. Запуск другого контейнера из того же образа даст вам чистый лист без файлов, которые вы добавили с помощью docker cp.

Краткое содержание

docker cp позволяет перемещать файлы между хостом и контейнерами Docker. Он работает с файлами и каталогами, но ему не хватает большинства расширенных функций командной оболочки cp.

Регулярное использование docker cp указывает на потенциальный отход от лучших практик использования контейнеров. Разумно рассматривать его как удобный инструмент для разработки, а не как неотъемлемую часть работы с контейнерами. Долгосрочное сохранение файлов должно быть реализовано с помощью томов, поскольку это первоклассные компоненты экосистемы Docker.