«1. Введение

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

В этом руководстве мы рассмотрим несколько способов копирования файлов в контейнеры Docker и из них.

2. Команда Docker cp

Самый быстрый способ скопировать файлы в контейнер Docker и из него — использовать команду docker cp. Эта команда очень похожа на команду Unix cp и имеет следующий синтаксис:

docker cp \u003cSRC\u003e \u003cDEST\u003e

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

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

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

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

Еще один недостаток этого подхода заключается в том, что у нас могут возникнуть проблемы с владением файлом. Контейнеры Docker обычно имеют только пользователя root, что означает, что файлы, созданные внутри контейнера, по умолчанию будут иметь права root. Мы можем использовать команду Unix chown для восстановления права собственности на файл, если это необходимо на хост-компьютере.

4. Dockerfile

Файлы 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. Заключение