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

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

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

docker cp принимает пути источника и назначения в качестве двух аргументов:

docker cp example.txt мой-контейнер: /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 — Следуйте символическим ссылкам в исходном каталоге, чтобы скопировать содержимое целевых ссылок, а не сами ссылки.

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

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

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

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

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

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

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

А как насчет КОПИРОВАНИЯ в Dockerfiles?

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

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

КОПИРОВАТЬ / home / me / my-website / var / www / html /.

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

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

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

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

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

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

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

Резюме

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

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *