Как использовать команду docker container cp для копирования файлов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/run -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/ps -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/start -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/stop -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/rm -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/exec -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/pull -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} docker/cp -.-> lab-555105{{"Как использовать команду docker container cp для копирования файлов"}} end

Копирование локального файла в контейнер

На этом шаге вы научитесь копировать файл из локальной файловой системы в работающий Docker-контейнер. Это распространённая задача, когда требуется добавить конфигурационные файлы, скрипты или другие данные в уже запущенный контейнер.

Сначала создадим простой текстовый файл на локальной машине в директории ~/project.

echo "This is a test file." > ~/project/test_file.txt

Эта команда создаёт файл test_file.txt в директории ~/project с текстом "This is a test file.".

Далее нам понадобится работающий контейнер для копирования файла. Мы будем использовать образ ubuntu. Поскольку образ может отсутствовать локально, сначала загрузим его.

docker pull ubuntu:latest

Эта команда загружает последнюю версию образа ubuntu из Docker Hub.

Теперь запустим контейнер на основе образа ubuntu. Запустим его в фоновом режиме (-d) и присвоим имя (my_ubuntu_container) для удобства идентификации.

docker run -d --name my_ubuntu_container ubuntu:latest sleep infinity

Эта команда создаёт новый контейнер с именем my_ubuntu_container на основе образа ubuntu:latest. Команда sleep infinity поддерживает работу контейнера бесконечно, что полезно для демонстрации.

Проверить, что контейнер работает, можно командой docker ps.

docker ps

В выводе должен отображаться my_ubuntu_container.

Теперь скопируем файл test_file.txt с локальной машины в контейнер с помощью команды docker cp. Синтаксис: docker cp <локальный_путь> <имя_контейнера>:<путь_в_контейнере>.

docker cp ~/project/test_file.txt my_ubuntu_container:/tmp/

Эта команда копирует файл ~/project/test_file.txt в директорию /tmp/ внутри контейнера my_ubuntu_container.

Чтобы убедиться в успешном копировании, выполним команду внутри контейнера с помощью docker exec. Используем ls для вывода списка файлов в директории /tmp/ контейнера.

docker exec my_ubuntu_container ls /tmp/

В выводе должен отображаться test_file.txt, что подтверждает успешное копирование.

Наконец, удалим созданный контейнер.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Эти команды останавливают и удаляют контейнер соответственно.

Копирование файлов из контейнера в локальную файловую систему

На этом шаге вы научитесь копировать файлы из работающего Docker-контейнера в локальную файловую систему. Это полезно для извлечения логов, конфигурационных файлов или других данных, сгенерированных или изменённых внутри контейнера.

Сначала убедимся, что у нас есть работающий контейнер. Мы будем использовать контейнер my_ubuntu_container из предыдущего шага. Если он не запущен, запустим его.

docker start my_ubuntu_container

Эта команда запускает контейнер с именем my_ubuntu_container.

Теперь создадим файл внутри контейнера, который мы скопируем на локальную машину. Используем docker exec для выполнения команды внутри контейнера, чтобы создать файл container_file.txt в директории /root/.

docker exec my_ubuntu_container sh -c 'echo "This file is from the container." > /root/container_file.txt'

Эта команда выполняет shell-команду внутри my_ubuntu_container для создания файла /root/container_file.txt с указанным содержимым.

Чтобы убедиться, что файл создан внутри контейнера, можно использовать docker exec для вывода списка файлов в директории /root/ контейнера.

docker exec my_ubuntu_container ls /root/

В выводе должен отображаться файл container_file.txt.

Теперь скопируем container_file.txt из контейнера на локальную машину с помощью команды docker cp. Синтаксис для копирования из контейнера: docker cp <имя_контейнера>:<путь_в_контейнере> <локальный_путь>. Скопируем файл в директорию ~/project/.

docker cp my_ubuntu_container:/root/container_file.txt ~/project/

Эта команда копирует файл /root/container_file.txt из контейнера my_ubuntu_container в локальную директорию ~/project/.

Чтобы проверить успешное копирование на локальную машину, выведем список файлов в директории ~/project/.

ls ~/project/

В выводе должен отображаться файл container_file.txt вместе с test_file.txt из предыдущего шага.

Также можно просмотреть содержимое скопированного файла с помощью команды cat.

cat ~/project/container_file.txt

Вывод должен содержать текст "This file is from the container.", что подтверждает корректное копирование содержимого.

Наконец, удалим контейнер.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Вывод содержимого файла из контейнера в STDOUT

На этом шаге вы научитесь выводить содержимое файла из работающего Docker-контейнера напрямую в стандартный вывод (STDOUT) вашей локальной машины. Это полезно для быстрого просмотра содержимого файла в контейнере без его явного копирования.

Сначала убедитесь, что контейнер my_ubuntu_container запущен. Если нет, запустите его.

docker start my_ubuntu_container

Теперь создадим ещё один файл внутри контейнера, содержимое которого мы будем выводить в STDOUT. Создадим файл stream_test.log в директории /var/log/ контейнера.

docker exec my_ubuntu_container sh -c 'echo "This is a log entry." > /var/log/stream_test.log'

Эта команда выполняет shell-команду внутри my_ubuntu_container для создания файла /var/log/stream_test.log с указанным содержимым.

Для вывода содержимого этого файла в локальный STDOUT можно использовать команду docker exec с командой cat внутри контейнера.

docker exec my_ubuntu_container cat /var/log/stream_test.log

Эта команда выполняет cat /var/log/stream_test.log внутри контейнера my_ubuntu_container. Вывод этой команды из контейнера передаётся в STDOUT вашего локального терминала.

Вы должны увидеть содержимое "This is a log entry.", выведенное напрямую в ваш терминал. Это демонстрирует, как можно быстро просмотреть содержимое файла внутри контейнера без необходимости копировать весь файл.

Наконец, удалим контейнер.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Передача локального tar-архива в контейнер через STDIN

На этом шаге вы научитесь передавать локальный tar-архив напрямую в работающий Docker-контейнер с использованием стандартного ввода (STDIN). Это эффективный способ передачи нескольких файлов или директорий в контейнер без создания промежуточных файлов на локальной машине.

Сначала создадим директорию и несколько файлов в локальной директории ~/project, которые мы заархивируем и передадим.

mkdir ~/project/my_files
echo "File 1 content." > ~/project/my_files/file1.txt
echo "File 2 content." > ~/project/my_files/file2.txt

Эта команда создаёт директорию my_files и два текстовых файла внутри неё.

Убедитесь, что контейнер my_ubuntu_container запущен. Если нет, запустите его.

docker start my_ubuntu_container

Для передачи tar-архива в контейнер мы используем команду tar для создания архива директории my_files и перенаправим его вывод (с помощью |) в команду docker exec. Внутри контейнера мы снова используем tar для распаковки архива.

Мы передадим архив в директорию /opt/ внутри контейнера.

tar -cvf - ~/project/my_files | docker exec -i my_ubuntu_container tar -xvf - -C /opt/

Разберём эту команду:

  • tar -cvf - ~/project/my_files: создаёт tar-архив (-c) с подробным выводом (-v) директории ~/project/my_files. Опция -f - указывает tar записать архив в стандартный вывод.
  • |: перенаправляет стандартный вывод команды tar (архив) на стандартный ввод следующей команды.
  • docker exec -i my_ubuntu_container tar -xvf - -C /opt/: выполняет команду tar внутри контейнера my_ubuntu_container. Флаг -i важен, так как он оставляет STDIN открытым для команды exec, позволяя получать передаваемые данные. Команда tar -xvf - распаковывает (-x) с подробным выводом (-v) из стандартного ввода (-f -). Опция -C /opt/ меняет директорию на /opt/ перед распаковкой, поэтому содержимое архива будет извлечено в /opt/my_files внутри контейнера.

Чтобы убедиться, что файлы успешно переданы и распакованы внутри контейнера, выведем содержимое директории /opt/my_files/ с помощью docker exec.

docker exec my_ubuntu_container ls /opt/my_files/

В выводе должны отображаться файлы file1.txt и file2.txt, что подтверждает успешную передачу и распаковку архива.

Наконец, очистим контейнер и локальные файлы.

docker stop my_ubuntu_container
docker rm my_ubuntu_container
rm -rf ~/project/my_files

Итоги

В этой лабораторной работе вы научились использовать команду docker container cp для копирования файлов между локальной файловой системой и работающим Docker-контейнером. Вы попрактиковались в копировании локального файла в контейнер, демонстрируя, как добавлять необходимые данные или конфигурации после запуска контейнера. Это включало создание локального файла, запуск простого контейнера Ubuntu и использование docker cp для переноса файла в директорию /tmp контейнера.