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

Обновлено: 21.11.2024

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

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

Чтобы скопировать файл из контейнера на локальный компьютер.

Если вы хотите скопировать файл из своего контейнера на локальный компьютер, вы можете использовать следующую команду.

Если у вас есть контейнер Ubuntu с идентификатором f4628571q5gc и вы хотите скопировать файл из пути /usr/src/app/file.txt в контейнере в /home/username/Desktop/folder на локальном компьютере, вы можно использовать команду -

Если вы хотите вставить файл в текущий каталог вашего локального компьютера, вы можете просто использовать -

Если вы хотите скопировать все файлы из определенной папки в контейнере в папку на локальном компьютере, используйте следующую команду -

Чтобы скопировать файл с локального компьютера в контейнер

Если вы хотите скопировать файл с локального компьютера в контейнер, вы можете использовать следующую команду.

Если у вас есть контейнер Ubuntu с идентификатором f4628571q5gc и вы хотите скопировать файл с пути /home/username/Desktop/folder/file.txt на локальном компьютере в /usr/src/app/ в контейнере, можно использовать команду -

Если вы хотите скопировать все файлы из папки на локальном компьютере в папку в контейнере, используйте следующую команду -

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

Утилита docker cp копирует содержимое SRC_PATH в DEST_PATH . Вы можете копировать из файловой системы контейнера на локальную машину или наоборот, из локальной файловой системы в контейнер. Если для SRC_PATH или DEST_PATH указано -, вы также можете передать tar-архив из STDIN или в STDOUT. CONTAINER может быть запущенным или остановленным контейнером. SRC_PATH или DEST_PATH может быть файлом или каталогом.

Команда docker cp предполагает, что пути к контейнерам указаны относительно каталога / (корневого) контейнера. Это означает, что ввод начальной косой черты необязателен; Команда видит сострадательный_дарвин:/tmp/foo/myfile.txt и сострадательный_дарвин:tmp/foo/myfile.txt как идентичные. Пути к локальному компьютеру могут быть абсолютными или относительными. Команда интерпретирует относительные пути локальной машины как относительные к текущему рабочему каталогу, в котором запускается docker cp.

Команда cp ведет себя так же, как команда Unix cp -a, в которой каталоги рекурсивно копируются с сохранением разрешений, если это возможно. Право собственности устанавливается для пользователя и основной группы в месте назначения. Например, файлы, скопированные в контейнер, создаются с UID:GID пользователя root. Файлы, скопированные на локальный компьютер, создаются с использованием UID:GID пользователя, вызвавшего команду docker cp. Однако, если вы укажете параметр -a, docker cp установит права собственности на пользователя и основную группу в источнике. Если вы укажете параметр -L, docker cp следует любой символической ссылке в SRC_PATH. docker cp не создает родительские каталоги для DEST_PATH, если они не существуют.

Предполагая, что разделитель пути / , первый аргумент SRC_PATH и второй аргумент DEST_PATH , поведение будет следующим:

  • SRC_PATH указывает файл
    • DEST_PATH не существует
      • файл сохраняется в файле, созданном в DEST_PATH
      • Условие ошибки: каталог назначения должен существовать.
      • целевой файл перезаписывается содержимым исходного файла
      • файл копируется в этот каталог, используя базовое имя из SRC_PATH
      • DEST_PATH не существует
        • DEST_PATH создается как каталог, и содержимое исходного каталога копируется в этот каталог
        • Ошибка: невозможно скопировать каталог в файл
        • SRC_PATH не заканчивается на /. (то есть: косая черта, за которой следует точка)
          • исходный каталог копируется в этот каталог
          • содержимое исходного каталога копируется в этот каталог

          Эта команда требует, чтобы SRC_PATH и DEST_PATH существовали в соответствии с приведенными выше правилами.Если SRC_PATH является локальным и является символической ссылкой, по умолчанию копируется символическая ссылка, а не цель. Чтобы скопировать цель ссылки, а не ссылку, укажите параметр -L.

          Двоеточие ( : ) используется в качестве разделителя между CONTAINER и его путем. Вы также можете использовать : при указании путей к SRC_PATH или DEST_PATH на локальном компьютере, например, file:name.txt. Если вы используете : в пути к локальному компьютеру, вы должны указать относительный или абсолютный путь, например:

          Невозможно скопировать определенные системные файлы, такие как ресурсы в каталогах /proc , /sys , /dev , tmpfs и объекты монтирования, созданные пользователем в контейнере. Однако вы все равно можете скопировать такие файлы, вручную запустив tar в docker exec. Оба следующих примера делают одно и то же по-разному (считайте, что SRC_PATH и DEST_PATH — это каталоги):

          Использование - поскольку SRC_PATH передает содержимое STDIN в виде tar-архива. Команда извлекает содержимое tar в DEST_PATH в файловой системе контейнера. В этом случае DEST_PATH должен указывать каталог. Использование - as DEST_PATH передает содержимое ресурса в виде tar-архива в STDOUT .

          Я думаю использовать Docker для создания зависимостей на сервере непрерывной интеграции (CI), чтобы мне не приходилось устанавливать все среды выполнения и библиотеки на самих агентах.

          Чтобы добиться этого, мне нужно скопировать артефакты сборки, созданные внутри контейнера, обратно на хост. Это возможно?

          26 ответов 26

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

          Вот пример:

          Здесь goofy_roentgen — это имя контейнера, полученное с помощью следующей команды:

          Вы также можете использовать (часть) идентификатор контейнера. Следующая команда эквивалентна первой

          Вот удобный способ получить последний контейнер, если вы просто используете docker для временной среды Linux: docker ps -alq .

          В более новых версиях docker вы можете копировать двунаправленно (от хоста к контейнеру или от контейнера к хосту) с помощью docker cp .

          ПРИМЕЧАНИЕ: для использования команды cp контейнер не обязательно должен быть запущен. Удобно, если ваш контейнер постоянно падает.

          Вам не нужно использовать docker run .

          Это можно сделать с помощью docker create .

          Команда docker create создает слой контейнера с возможностью записи поверх указанного образа и подготавливает его для выполнения указанной команды. Затем идентификатор контейнера выводится в STDOUT. Это похоже на docker run -d, за исключением того, что контейнер никогда не запускается.

          Здесь вы никогда не запускаете контейнер. Мне это показалось выгодным.

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

          @HonzaKalfus Я согласен, что это должно быть выше. Это именно то, что я был после. Я использовал это, чтобы создать несколько двоичных файлов, используя известную среду (Amazon Linux в определенной версии). смог создать сценарий оболочки, который полностью построил докер и извлек из него результирующий двоичный файл! Идеально.

          @jII, я сделал это, потому что позже я запускаю на нем докер. В простых случаях он не нужен, но и здесь не помешает.

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

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

          Предупреждение. При этом могут возникнуть проблемы с идентификатором пользователя докера, совпадающим с идентификатором текущего работающего пользователя. То есть файлы в /artifacts будут отображаться как принадлежащие пользователю с UID пользователя, используемым внутри контейнера докеров. Обойти это можно, используя UID вызывающего пользователя:

          Описание

          docker запускается с хост-томом, выбирает артефакт, копирует артефакт на хост-том:

          Этот трюк работает, потому что вызов chown внутри heredoc принимает значения $(id -u):$(id -g) из-за пределов работающего контейнера; то есть узел докера.

          • вам не нужно запускать контейнер docker --name или создавать контейнер docker --name перед этим
          • вам не нужно запускать docker container rm после

          Проголосовал за сравнение ответов на основе cp и объема. Кроме того, для трюка с идентификатором для владения иногда это настоящая головная боль

          Смонтируйте том, скопируйте артефакты, настройте идентификатор владельца и идентификатор группы:

          EDIT: обратите внимание, что некоторые команды, такие как $(id -u), имеют обратную косую черту и поэтому будут обрабатываться внутри контейнера, в то время как те, которые не имеют обратной косой черты, будут обрабатываться оболочкой, запущенной на хост-компьютере ДО команды отправляются в контейнер.

          Отредактировано, чтобы добавить разъяснение того, что я чуть не пропустил. Кстати, я не уверен, почему вы меняете его на user:user вместо user:group, но в остальном выглядит хорошо!

          containerId можно получить с помощью команды docker ps -a

          исходный путь должен быть абсолютным. например, если каталог приложения/службы начинается с приложения в вашем док-контейнере, путь будет /app/some_directory/file

          пример: docker cp d86844abc129:/app/server/output/server-test.jpg C:/Users/someone/Desktop/output

          В большинстве ответов не указано, что контейнер должен быть запущен, прежде чем docker cp заработает:

          Кстати, похоже, что контейнер должен/может быть запущен/остановлен/либо, зависит от типа хоста/техники виртуализации. Текущий документ докера говорит: «КОНТЕЙНЕР может быть запущенным или остановленным контейнером». Несколько мест на SO, включая комментарий к принятому ответу, говорят: «Это также работает с остановленным контейнером». В Windows Hyper-V очевидно необходимо остановить контейнер перед копированием файла.

          Если у вас нет запущенного контейнера, а есть только изображение, и если вы хотите скопировать только текстовый файл, вы можете сделать что-то вроде этого:

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

          Для Windows:

          От DockerContainer к LocalMachine

          От LocalMachine к DockerContainer

          В выпуске Docker 19.03 можно не создавать контейнер и даже образ. В сборках на основе BuildKit есть возможность изменить место назначения вывода. Вы можете использовать это для записи результатов сборки в локальный каталог, а не в образ. Например. вот сборка бинарника go:

          Из приведенного выше Dockerfile я создаю этап артефакта, который включает только те файлы, которые я хочу экспортировать. А недавно введенный флаг --output позволяет мне записывать их в локальный каталог вместо изображения. Это необходимо выполнить с помощью движка BuildKit, который поставляется с 19.03:

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

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

          Оглавление

          Предпосылки

          Если вы хотите следовать пошаговым инструкциям, убедитесь, что у вас есть следующее:

          • Хост Linux. В этом руководстве используется Ubuntu 18.04.5 LTS.
          • 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 будет скопирован с узла докера в контейнер.

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

          • флажок d, который запускает контейнер в фоновом режиме и поддерживает его работу до тех пор, пока он не будет удален.
          • Флаг p публикует порт 80 контейнера на хост через порт 80 .
          • nginx будет образом, который будет использоваться для запуска контейнера.

          Выполнение команды запуска Docker

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

          Проверка контейнера Docker с помощью команды docker ps

          Перед выполнением команды Docker cp синтаксис команды Docker cp:

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

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

          • Использование архива или a — копирование всех разрешений пользователя и основной группы для файлов и папок.
          • Использование L. Указание параметра L позволит скопировать любую символическую ссылку в исходном пути в путь назначения.
          <р>5. Затем выполните команду docker cp. Команда docker cp скопирует созданный ранее файл myfile.txt в каталог контейнеров /usr/share. ccae4670f030 — идентификатор контейнера, в который будет скопирован файл myfile.txt.

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

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

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

          Подключение по SSH к запущенному контейнеру с помощью команды docker exec

          <р>7. После входа в контейнер проверьте, был ли скопирован файл myfile.txt в контейнер с помощью команды ls.

          • ls — это команда для просмотра списка компьютерных файлов в Unix и Unix-подобных операционных системах.
          • grep будет искать все файлы или папки, начиная со строки my, в каталоге usr/share.

          Проверка файлов в контейнере

          Копирование файлов с помощью DockerFile

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

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

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

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

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

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

          Приведенный ниже DockerFile содержит различные шаги/инструкции по созданию нового контейнера:

          • FROM: инструкция FROM инициализирует новый этап сборки и устанавливает базовый образ для последующих инструкций.
          • COPY – команда COPY копирует файл с хост-компьютера (хост Docker) в контейнер.
          <р>4. Проверьте все необходимые файлы для создания нового образа, выполнив команду дерева. Вы должны увидеть файлы Dockerfile, myfile1.txt и myfile2.txt в каталоге ~/host-to-container-copy-demo.

          Проверяет файлы и папки с помощью команды дерева

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

          Сборка образа Docker с помощью команды сборки docker

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

          Атрибут репозитория

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

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

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

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

          Проверка файлов, если они успешно скопированы в контейнер

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

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

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

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

          <р>2. Убедитесь, что том успешно создан, выполнив команду docker volume ls. Команда docker volume ls выводит список томов. После запуска команды docker volume ls вы увидите my-vol в атрибуте ИМЯ ТОМА, что подтверждает успешное создание тома.

          Список томов Docker

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

          • Контейнер с именем volume_testing использует последний образ nginx:.
          • d запускает контейнер в фоновом режиме и поддерживает его до тех пор, пока не будет удален.
          • Флаг v подключает том my-vol, созданный на хосте Docker, к целевому каталогу /app контейнера.

          Выполнение команды Docker и подключение тома с контейнером

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

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

          Проверка томов в контейнере

          Заключение

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

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

          Ненавидите рекламу? Хотите поддержать писателя? Получите многие из наших руководств в виде руководства по ATA.

          Ещё от ATA Learning & Partners

          Резервное копирование Office 365 для чайников

          Лучшее руководство по защите данных Microsoft Office 365. Изучите готовые функции безопасности.

          Руководства ATA

          ATA известна своими высококачественными письменными учебными пособиями в виде сообщений в блогах. Поддержите ATA с помощью электронных книг ATA Guidebook PDF, доступных в автономном режиме и без рекламы!

          Если у вас запущен контейнер Docker и вы хотите скопировать файлы с хост-компьютера в контейнер Docker, это можно сделать несколькими способами.Один из способов сделать это — использовать инструкции ADD или COPY внутри Dockerfile и передать пути к файлам, которые должны быть в вашем контейнере при его запуске. Но что произойдет, если у вас уже запущен контейнер? Невозможно создавать один и тот же образ снова и снова только для того, чтобы включить в него небольшой файл.

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

          Способ 1. Использование команды Docker cp

          Команду Docker cp можно использовать для копирования файлов и каталогов с хост-компьютера в контейнер и наоборот. Чтобы скопировать один файл с хоста в контейнер, вы можете использовать приведенную ниже команду.

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

          Если вы хотите скопировать несколько файлов из папки на хост-компьютере в контейнер, вы можете использовать следующую команду.

          Способ 2. Подключение каталога хоста

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

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

          Теперь попробуем получить доступ к bash контейнера, выполнив команду bash с помощью команды Docker exec.

          Теперь, когда у вас есть доступ к bash контейнера, вы можете запустить приведенную ниже команду, чтобы скопировать файлы.

          Способ 3. Использование команды Cat

          Еще один довольно простой способ копирования файлов при создании контейнера — использование команды cat в качестве аргумента команды запуска Docker.

          Если у вас уже запущен контейнер Docker, вы можете использовать команду exec Docker с той же командой cat.

          Способ 4. Использование команды tar

          Вы также можете использовать команду tar, чтобы преобразовать файл в tarball-файл и передать его с помощью команды Docker exec. Приведенная ниже команда скопировала файл file.txt в каталог /usr внутри контейнера.

          Подводя итог, в этой статье мы обсудили 4 различных метода копирования файлов с хост-компьютера в контейнер Docker. Мы увидели, как копировать файлы с хоста в работающий контейнер, а также в контейнер, который даже не был создан. Для решения этой задачи мы использовали такие инструменты, как Docker cp, Docker exec и т. д. Лучше всего использовать традиционную команду Docker cp. В зависимости от ваших требований и варианта использования вы можете выбрать наилучший способ копирования файлов.

          Читайте также: