Перейти к основному содержимому

Копирование файлов в контейнеры Docker и из них

· 4 мин. чтения

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 и из него. Каждый из них имеет свои плюсы и минусы, поэтому мы должны выбрать подход, который лучше всего соответствует нашим потребностям.