Как скопировать файлы с помощью Docker cp в ваш контейнер Docker

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

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

Приступим!

Предварительные требования

Если вы хотите следовать шаг за шагом, убедитесь, что у вас есть следующее:

  • Docker установлен на хосте Linux. В этом учебнике используется Docker v19.03.11. Вы можете подтвердить версию Docker, запустив docker version.

Копирование файлов с помощью команды docker cp

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

Давайте научимся использовать команду Docker cp на примере.

1. Откройте терминал на вашем локальном компьютере.

2. Создайте файл с именем myfile.txt с использованием команды touch. Файл myfile.txt будет скопирован с хоста docker в контейнер.

touch myfile.txt

3. Выполните команду docker run. Ниже указанная команда docker run создаст новый контейнер в фоновом режиме. Ниже команда содержит три параметра, описанных ниже:

  • d flag that runs the container in the background and keeps it alive until deleted.
  • p flag publishes a container’s port 80 to the host on port 80.
  • nginx будет образом, который будет использоваться для запуска контейнера.
sudo docker run -d -p 80:80 nginx
Executing the Docker run command

4. Проверьте, успешно ли создан контейнер Docker, используя команду docker ps. После выполнения команды docker ps, вы должны увидеть новое значение, сгенерированное под атрибутом CONTAINER ID (в данном случае ccae4670f030), используя образ NGINX, что подтверждает, что контейнер успешно создан.

sudo docker ps
Verifying the docker container by running the docker ps command

Прежде чем выполнять команду Docker cp, синтаксис команды Docker cp таков:

  • CONTAINER: SRC_PATH указывает исходный путь контейнера.
  • DEST_PATH является путем назначения на хосте.
  • CONTAINER: DEST_PATH является путем назначения в контейнере.

Кроме того, вы также можете добавить options с нижеперечисленными параметрами в команду следующим образом:

  • Использование параметра архивации или а – Копирует все разрешения пользователя и основной группы файлов и папок.
  • Использование параметра L – Указание опции L позволит скопировать любую символическую ссылку в исходном пути в пункт назначения.
# Синтаксис для копирования из контейнера на хост Docker  
docker cp {options} CONTAINER:SRC_PATH DEST_PATH 
# Синтаксис для копирования с хоста Docker в контейнер  
docker cp {options} SRC_PATH CONTAINER:DEST_PATH 

5. Затем выполните команду docker cp. Команда docker cp скопирует myfile.txt, который вы создали ранее, в каталог /usr/share контейнера. ccae4670f030 – идентификатор контейнера, в который будет скопирован myfile.txt.

sudo docker cp myfile.txt ccae4670f030:/usr/share

6. Наконец, выполните вход по SSH в работающий контейнер, запустив команду docker exec с использованием /bin/bash, который используется в качестве оболочки по умолчанию для входа пользователя в систему Linux.

  • Флаг i указывает, что вы хотите открыть интерактивную сессию SSH в контейнере. Флаг i не закрывает сеанс SSH, даже если контейнер не присоединен.
  • Флаг t выделяет псевдо-TTY, который необходимо использовать для интерактивного выполнения команд.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash

Вы увидите ниже, что теперь подключены к оболочке контейнера, когда выполняете docker exec.

SSH into the running container using docker exec command

7. После входа в контейнер убедитесь, что файл myfile.txt был скопирован в контейнер с использованием команды ls.

  • ls – это команда для отображения файлов на компьютере в операционных системах Unix и подобных им.
  • grep будет искать все файлы или папки, начинающиеся со строки my внутри директории usr/share.
Verifying the files in the container

Копирование файлов с использованием Dockerfile

В предыдущем разделе вы узнали, как скопировать файлы в контейнер, выполнив команду Docker cp. А если вам нужно скопировать несколько файлов за один раз? Конечно, выполнение нескольких команд становится избыточным! Чтобы решить проблему выполнения нескольких команд cp, почему бы не попробовать копировать файлы или папки в контейнеры с использованием Dockerfile с помощью команд COPY?

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

Давайте создадим Dockerfile, запустим контейнер из него и, наконец, скопируем файлы.

1. Создайте папку с именем ~/host-to-container-copy-demo, затем измените (cd) рабочий каталог на этот каталог. В этом каталоге будут содержаться все файлы, которые вы создадите в этом демонстрационном примере.

mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo

2. Теперь создайте два текстовых файла с именами myfile1.txt и myfile2.txt, скопируйте и вставьте их в файлы, и сохраните их в директории ~/host-to-container-copy-demo.

# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.

3. Создайте еще один файл, скопируйте/вставьте нижеуказанную конфигурацию и сохраните файл как Dockerfile в каталоге ~/host-to-container-copy-demo. После завершения Docker будет использовать этот Dockerfile для выполнения всех необходимых команд построения нового образа Docker поверх базового образа.

Ниже приведен Dockerfile с различными шагами/инструкциями для создания нового контейнера:

  • FROM Инструкция FROM инициализирует новый этап сборки и устанавливает базовый образ для последующих инструкций.
  • COPY Команда COPY копирует файл с хост-машины (хост Docker) в контейнер.
# Инструкция для Dockerfile по созданию нового образа поверх базового образа (ubuntu)
# Использование базового образа ubuntu: latest
FROM ubuntu:latest
# Копирование myfile1.txt в каталог /usr/share контейнера
COPY myfile1.txt /usr/share
# Копирование myfile2.txt в каталог /tmp контейнера
COPY myfile2.txt /tmp

4. Проверьте все необходимые файлы для создания нового образа, выполнив команду tree. Вы должны увидеть Dockerfile, myfile1.txt и myfile2.txt в директории ~/host-to-container-copy-demo.

Verifies files and folders using tree command

5. Затем создайте образ, выполнив команду docker build. Флаг t используется для пометки образа updated_ubuntu_image тегом latest, и . позволяет Docker использовать все необходимые файлы из текущей рабочей директории.

sudo docker build -t updated_ubuntu_image:latest .
Building the Docker image by running the docker build command

6. Теперь проверьте вновь созданный образ updated_ubuntu_image, выполнив команду docker images. Обратите внимание на атрибут REPOSITORY. Этот атрибут – тег, созданный с флагом -t на предыдущем этапе.

sudo docker images
Repository Attribute

7. Наконец, запустите контейнер Docker, используя вновь созданный образ, выполнив команду docker run. Флаг -it указывает Docker выделить псевдотерминал, подключенный к стандартному вводу контейнера. bash предоставляет стандартную оболочку для входа пользователя в систему Linux.

sudo docker run -it updated_ubuntu_image bash

Теперь вы видите, что находитесь в оболочке Bash контейнера Docker.

Running the container using docker run command.

8. Затем проверьте, были ли файлы успешно скопированы в контейнер в директориях /tmp и /usr/share, выполнив команду ls.

Verifying the files if they are successfully copied on the container

Монтирование тома хранения и доступ к файлам с помощью команды Docker Volume

До сих пор вы узнали, как копировать файлы с хоста в контейнер, используя два различных подхода: с помощью команды docker cp и файла Docker (DockerFile). На этот раз давайте узнаем, как легко обмениваться файловыми системами между хостом и контейнерами, используя команду docker volume.

Предполагая, что вы все еще вошли в терминал:

1. Создайте том на хосте Docker, выполнив команду docker volume create. Нижеприведенная команда создаст том с именем my-vol. sudo docker volume create my-vol

sudo docker volume create my-vol

2. Проверьте, что том успешно создан, выполнив команду docker volume ls. Команда docker volume ls выводит том. После выполнения команды docker volume ls, вы увидите my-vol в атрибуте VOLUME NAME, что подтверждает успешное создание тома.

sudo docker volume ls
Listing the docker volumes

3. Затем запустите контейнер с помощью команды docker run.

  • Контейнер с именем volume_testing использует образ nginx:latest.
  • d flag runs the container in the background and keeps it alive until deleted.
  • v flag mounts the volume my-vol created on Docker host to the container’s destination /app directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
Running the Docker command and attaching the volume with the container

4. Проверьте, правильно ли примонтирован объем my-vol, который вы ранее создали, с контейнером, используя команду docker inspect. Команда Docker inspect предоставляет информацию о контейнере. После выполнения команды docker inspect будут отображены все подробности указанного контейнера (детали volume_testing), включая детали монтирования, как показано ниже.

sudo docker inspect volume_testing

Ниже представлен снимок экрана изображения, который подтверждает, что объем (my-vol), созданный на хосте, успешно примонтирован с каталогом /app контейнера.

Verifying the volumes in the container

Вывод

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

Таким образом, какой подход вы собираетесь использовать далее при копировании данных с хоста в контейнеры Docker?

Source:
https://adamtheautomator.com/docker-cp/