1. Введение
Поскольку все больше наших приложений развертывается в облачных средах, работа с Docker становится необходимым навыком для разработчиков. Часто при отладке приложений полезно копировать файлы в наши контейнеры Docker или из них.
В этом руководстве мы рассмотрим несколько различных способов копирования файлов в контейнеры Docker и из них.
2. Команда Docker cp
Самый быстрый способ скопировать файлы в контейнер Docker и из него — использовать команду docker cp
. Эта команда очень похожа на команду Unix cp и имеет следующий синтаксис:
docker cp <SRC> <DEST>
Прежде чем мы рассмотрим некоторые примеры этой команды, давайте предположим, что у нас запущены следующие контейнеры Docker:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1477326feb62 grafana/grafana "/run.sh" 2 months ago Up 3 days 0.0.0.0:3000->3000/tcp grafana
8c45029d15e8 prom/prometheus "/bin/prometheus --c…" 2 months ago Up 3 days 0.0.0.0:9090->9090/tcp prometheus
Первый пример копирует файл из каталога /tmp
на хост-компьютере в каталог установки Grafana в контейнере grafana
:
docker cp /tmp/config.ini grafana:/usr/share/grafana/conf/
Мы также можем использовать идентификаторы контейнеров вместо их имен:
docker cp /tmp/config.ini 1477326feb62:/usr/share/grafana/conf/
Чтобы скопировать файлы из контейнера grafana в каталог
/tmp
на хост-компьютере, мы просто меняем порядок параметров:
docker cp grafana:/usr/share/grafana/conf/defaults.ini /tmp
Мы также можем скопировать весь каталог вместо отдельных файлов. В этом примере весь каталог conf
копируется из контейнера grafana в каталог
/tmp
на хост-компьютере:
docker cp grafana:/usr/share/grafana/conf /tmp
Команда docker cp
имеет некоторые ограничения. Во- первых, мы не можем использовать его для копирования между двумя контейнерами . Его можно использовать только для копирования файлов между хост-системой и одним контейнером.
Во-вторых, несмотря на тот же синтаксис, что и команда Unix cp , она не поддерживает те же флаги. На самом деле он поддерживает только два:
-a
: режим архива, который сохраняет всю информацию uid/gid копируемых файлов
-L
: всегда использовать символические ссылки в SRC
3. Объемные крепления
Другой способ копировать файлы в контейнеры Docker и из них — использовать монтирование тома. Это означает, что мы делаем каталог из хост-системы доступным внутри контейнера.
Чтобы использовать монтирование томов, мы должны запустить наш контейнер с флагом -v
:
docker run -d --name=grafana -p 3000:3000 grafana/grafana -v /tmp:/transfer
Приведенная выше команда запускает контейнер grafana
и монтирует каталог /tmp
с хост-компьютера как новый каталог внутри контейнера с именем /transfer
. Если бы мы захотели, мы могли бы указать несколько флагов -v
для создания нескольких монтирований томов внутри контейнера.
Этот подход имеет несколько преимуществ. Во- первых, мы можем использовать команду Unix cp, которая имеет гораздо больше флагов и параметров, чем команда docker cp
.
Второе преимущество — мы можем создать единую общую директорию для всех контейнеров Docker . Это означает, что мы можем копировать напрямую между контейнерами, если все они имеют один и тот же монтированный том.
Имейте в виду, что у этого подхода есть недостаток, заключающийся в том, что все файлы должны проходить через монтирование тома. Это означает, что мы не можем копировать файлы одной командой . Вместо этого мы сначала копируем файлы в смонтированный каталог, а затем в их окончательное желаемое расположение.
Еще один недостаток этого подхода заключается в том, что у нас могут возникнуть проблемы с владением файлами. Контейнеры Docker обычно имеют только пользователя root, что означает, что файлы, созданные внутри контейнера, по умолчанию будут иметь права root . Мы можем использовать команду Unix chown для
восстановления права собственности на файл, если это необходимо на хост-компьютере.
4. Докерфайл
Файлы Docker используются для создания образов Docker, которые затем создаются в контейнерах Docker. Файлы Docker могут содержать несколько разных инструкций, одна из которых — COPY
.
Инструкция COPY
позволяет нам скопировать файл (или файлы) из хост-системы в образ. Это означает, что файлы становятся частью каждого контейнера, созданного из этого образа.
Синтаксис инструкции COPY
аналогичен другим командам копирования, которые мы видели выше:
COPY <SRC> <DEST>
Как и другие команды копирования, SRC
может быть либо отдельным файлом, либо каталогом на хост-компьютере. Он также может включать подстановочные знаки для соответствия нескольким файлам.
Давайте посмотрим на некоторые примеры.
Это скопирует сингл из текущего контекста сборки Docker в образ:
COPY properties.ini /config/
И это скопирует все файлы XML в образ Docker:
COPY *.xml /config/
Главный недостаток этого подхода в том, что мы не можем использовать его для запуска контейнеров Docker . Образы Docker не являются контейнерами Docker , поэтому этот подход имеет смысл использовать только тогда, когда заранее известен набор файлов, необходимых внутри образа.
5. Вывод
В этом руководстве мы увидели, как копировать файлы в контейнер Docker и из него. Каждый из них имеет свои плюсы и минусы, поэтому мы должны выбрать подход, который лучше всего соответствует нашим потребностям.