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

Я пытаюсь создать решение для резервного копирования и восстановления контейнеров Docker, с которыми мы работаем.

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

Я хочу создать сценарий, который запускается с хост-машины и создает новый контейнер, используя ubuntu:base образ Docker, а затем копирует файлы в этот контейнер.

Как я могу скопировать файлы с хоста в контейнер?


person user3001829    schedule 07.04.2014    source источник
comment
Если вы не хотите перестраивать, почему бы не docker commit? Это сохраняет ваш имидж.   -  person Berend de Boer    schedule 29.04.2014
comment
Просто замечание по поводу понятия, которое никто не рассматривал: в общем, относитесь к контейнерам как к эфемерным. Существуют варианты использования для копирования файлов в / из работающего контейнера (тестирование, прототипирование). Но если вы окажетесь в положении, когда вы не можете перестроить то, что вам нужно, с помощью Dockerfiles и / или составить, то вы можете оказаться в плохом месте. Обычно вы не хотите создавать резервные копии контейнеров, как если бы они были объектами ОС или даже виртуальной машины. В общем :-)   -  person Scott Prive    schedule 16.10.2017
comment
Возможный дубликат Копирование файлов из контейнера Docker на хост   -  person Shubham    schedule 30.11.2018
comment
Ссылка @ BerenddeBoer теперь устарела, вот новый URL: docs.docker.com/engine / ссылка / командная строка / фиксация   -  person Erin    schedule 21.08.2020


Ответы (45)


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

В контейнер можно скопировать один конкретный файл, например:

docker cp foo.txt mycontainer:/foo.txt

Из контейнера можно скопировать один конкретный файл, например:

docker cp mycontainer:/foo.txt foo.txt

Для подчеркивания, mycontainer - это идентификатор контейнера, не идентификатора изображения.

Несколько файлов, содержащихся в папке src, можно скопировать в папку target, используя:

docker cp src/. mycontainer:/target
docker cp mycontainer:/src/. target

Ссылка: Документы интерфейса командной строки Docker для cp

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

person 0x7d7b    schedule 12.08.2015
comment
также обратите внимание, что это может быть на хосте vm или основной ОС и работает либо от хоста к контейнеру, либо от vm к хосту (или основной ОС) - person Adam Tuliper - MSFT; 16.11.2015
comment
Есть ли способ сделать это из файла докеров? - person cph2117; 30.06.2016
comment
В Dockerfile вы можете использовать ключевое слово ADD для добавления файлов во время сборки. - person 0x7d7b; 30.06.2016
comment
Примечание. Возможно, вам придется использовать абсолютные пути. - person Zelphir Kaltstahl; 11.10.2016
comment
использовать docker cp для копирования из контейнера в хост работает хорошо, но при использовании его для копирования файлов с хоста в контейнер никакого эффекта ... кто-нибудь знает почему? версия докера: версия докера 1.10.3, сборка cb079f6-неподдерживаемая - person Ace.Yin; 29.11.2016
comment
Могу ли я скопировать несколько файлов с хоста в контейнер с помощью docker cp? - person Yogesh; 02.12.2016
comment
@ Ace.Yin Я думал, что у меня такая же проблема, но это было неправильное использование cp. См. это, чтобы скопировать содержимое каталога. Это также объясняется, конечно, в документации. - person Arnaud P; 07.04.2017
comment
Стоит отметить (по крайней мере, в Docker 18.09.1), что операции файловой системы с работающим контейнером Hyper-V не поддерживаются. - person duct_tape_coder; 20.03.2019
comment
docker cp foo.txt mycontainer:/ для сохранения того же имени файла (foo.txt) внутри контейнера - person Tarasovych; 04.12.2019
comment
sudo docker cp 6eae0949649c:/app/output.txt output.txt показывает open /home/rajan/Desktop/bashapp/output.txt: permission denied. Любое решение? - person Rajan Raju; 05.07.2021

  1. Получить имя контейнера или короткий идентификатор контейнера:

    $ docker ps
    
  2. Получить полный идентификатор контейнера:

    $ docker inspect -f   '{{.Id}}'  SHORT_CONTAINER_ID-or-CONTAINER_NAME
    
  3. Копировать файл:

    $ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE
    

ПРИМЕР:

$ docker ps

CONTAINER ID      IMAGE    COMMAND       CREATED      STATUS       PORTS        NAMES

d8e703d7e303   solidleon/ssh:latest      /usr/sbin/sshd -D                      cranky_pare

$ docker inspect -f   '{{.Id}}' cranky_pare

or

$ docker inspect -f   '{{.Id}}' d8e703d7e303

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
person solidleon    schedule 17.07.2014
comment
Для меня путь установки хоста содержал не aufs, а devicemapper. Самый простой способ проверить путь установки контейнера (пока он запущен) - запустить команду mount. - person derenio; 03.10.2014
comment
Я попробовал вышеуказанное решение. Он скопировал файлы в конкретный каталог докера. Однако, когда я использую bash для контейнера докеров, файлы там не отображаются. Что-то мне не хватает? - person AppleBud; 30.12.2014
comment
Новый путь - / var / lib / docker / devicemapper / mnt / ‹‹id›› / rootfs / - person mcuadros; 14.01.2015
comment
Для меня в Docker 1.4.1 (последняя версия) это /var/lib/docker/aufs/diff/<id>/ - person user193130; 22.01.2015
comment
Почему бы просто не использовать docker inspect -f '{{.Volumes}}' gitlab_app_7.10, чтобы получить ответ от самого докера? - person Blaisorblade; 11.05.2015
comment
@AppleBud У меня была аналогичная проблема с файлом, который не отображался в контейнере, когда я использовал этот метод. Это произошло потому, что целевое местоположение было в томе. Поэтому мне пришлось использовать docker inspect, чтобы найти расположение томов, чтобы скопировать файл прямо туда. Потом он обнаружился в контейнере. Объемы были меньше /var/lib/docker/vfs/dir/ - person Richard Corfield; 20.05.2015
comment
Вы можете использовать docker inspect -f '{{.Mounts}}' d8e703d7e303 - person Ste; 24.08.2015
comment
а что насчет бедных пользователей MacOS? Для меня каталог монтирования находится в /var/lib. find / -name docker тоже не помог. - person prayagupd; 01.12.2016

Самый чистый способ - смонтировать каталог хоста в контейнере при запуске контейнера:

{host} docker run -v /path/to/hostdir:/mnt --name my_container my_image
{host} docker exec -it my_container bash
{container} cp /mnt/sourcefile /path/to/destfile
person Ben Davis    schedule 12.08.2014
comment
как можно запустить контейнер? Я думал, что это можно сделать только с изображением. - person Pavel Zaitsev; 17.02.2015
comment
Я не могу заставить его работать, когда контейнер существует, он же работал раньше. Тар ниже работает нормально. - person Eino Mäkitalo; 23.04.2015
comment
Единственный способ, которым это сработало для меня, - это прикрепить том вместе с запуском изображения (создание экземпляра контейнера). Завершено: docker run -d -p -v /host/path:/mnt --name container_name image_name - person peter n; 13.06.2015
comment
У меня это не работает. По крайней мере, не удается запустить контейнер. Может запускать только изображение - person Shashank Hegde; 16.06.2015
comment
Я поражен тем, что docker cp - это односторонняя операция! - person ThorSummoner; 27.08.2015

Следующее - довольно уродливый способ сделать это, но он работает.

docker run -i ubuntu /bin/bash -c 'cat > file' < file
person Erik    schedule 11.06.2014
comment
Это прекрасно работает! Но не забудьте зафиксировать изменение: docker commit `docker ps -l -q` ubuntu-with-file. В противном случае изменение будет потеряно (используйте любое имя вместо ubuntu-with-file) - person Michael_Scharf; 27.09.2014
comment
Кроме того, мы можем использовать новую docker exec функцию для работы с запущенным контейнером: docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/ - person Mikl; 13.11.2014
comment
@Mikl Я думаю, что это должно быть docker exec -i ... вместо -it, потому что нет TTY при подключении из файла. - person z0r; 24.05.2015
comment
Мне удалось реализовать это на Java с помощью Remote API github.com/highel/docker-rest-file-upload/blob/master/ - person Boris Treukhov; 24.06.2015
comment
Это действительно кажется самым простым решением для одного файла. - person Kelvin; 06.08.2015
comment
Если вы все еще используете старую версию Docker (как и я) и хотите скопировать весь каталог, вы можете сделать это: tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory' - person eahanson; 02.02.2016
comment
Хм, у меня это не сработало с Docker 19.03.8, host Centos 8, ubuntu: образ 18.04. Он действительно создал file в контейнере, но он был пустым. - person wisbucky; 03.08.2020

Если вам нужно сделать это в работающем контейнере, вы можете использовать docker exec (добавлено в 1.3).

Сначала найдите имя или идентификатор контейнера:

$ docker ps
CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                   NAMES
b9b7400ddd8f        ubuntu:latest                "/bin/bash"         2 seconds ago       Up 2 seconds                                elated_hodgkin

В приведенном выше примере мы можем использовать b9b7400ddd8f или elated_hodgkin.

Если вы хотите скопировать все, что находится в /tmp/somefiles на хосте, в /var/www в контейнере:

$ cd /tmp/somefiles
$ tar -cv * | docker exec -i elated_hodgkin tar x -C /var/www

Затем мы можем выполнить /bin/bash в контейнере и убедиться, что он работает:

$ docker exec -it elated_hodgkin /bin/bash
root@b9b7400ddd8f:/# ls /var/www
file1  file2
person adean    schedule 24.01.2015
comment
Отлично работает на докере 1.16 на Centos 7.4 Отличная новаторская идея. - person Dudi Boy; 02.04.2018

Обычно бывает трех типов:

  1. От контейнера к хосту

    docker cp container_id:./bar/foo.txt .
    

dev1

  1. От хоста к контейнеру

    docker exec -i container_id sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    
  2. Второй подход к копированию с хоста в контейнер:

    docker cp foo.txt mycontainer:/foo.txt
    

dev2

  1. Из тары в тару смеси 1 и 2

    docker cp container_id1:./bar/foo.txt .
    
    docker exec -i container_id2 sh -c 'cat > ./bar/foo.txt' < ./foo.txt
    

dev3

person Ali Hallaji    schedule 03.03.2019
comment
docker cp работает в обоих направлениях. Не нужно запускать exec, cat и перенаправлять. docker cp host_file.txt контейнер: / путь / - person tbm; 27.03.2019
comment
А если требуется скопировать более одного файла, очень пригодится tar, примерно так: tar -czvf tmp.tar.gz *.* && docker exec -i container_id2 sh -c 'cat > ./bar/tmp.tar.gz && tar -xzvf tmp.tar.gz' < ./tmp.tar.gz - person stackguy; 07.04.2021

  1. Создайте новый файл докеров и используйте существующий образ в качестве основы.

    FROM myName/myImage:latest
    
    ADD myFile.py bin/myFile.py
    
  2. Затем соберите контейнер:

    docker build .
    
person RustyShackleford    schedule 08.07.2015
comment
Это то, что сработало для меня. Ничего больше. Спасибо! - person Owen; 02.01.2017
comment
Это создаст новый образ, а не непосредственно новый контейнер. Если вы повторно используете это изображение, пока myFile.py был изменен, он будет использовать старую версию файла, если вы не перестроите образ. - person Guillaume Lebreton; 15.12.2018
comment
Я считаю, что это самый быстрый способ, только если вы тестируете на удаленном сервере. - person Dominik Krulak; 06.12.2019
comment
Согласно this, большинству людей следует использовать COPY, а не чем ДОБАВИТЬ. Но для локальных файлов (как в этом примере) они эквивалентны. - person Alex Shroyer; 15.01.2020

Решение дано ниже,

Из оболочки Docker,

root@123abc:/root#  <-- get the container ID

От хозяина

cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/root

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

person pierce    schedule 23.06.2014
comment
Отличный ответ. В более новых выпусках докеров путь был переименован в / var / lib / docker / aufs / mnt / - person Alex Volkov; 19.12.2014
comment
Путь к устройству не работает в Fedora с docker 1.6. Поместите его как отдельный Q, stackoverflow .com / questions / 29939419 /, любые комментарии приветствуются. - person Yogesh_D; 29.04.2015

Другое решение для копирования файлов в работающий контейнер - использование tar:

tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -x

Копирует файл foo.sh в /tmp контейнера.

Изменить: удалить лишний -f, благодаря комментарию Маартена.

person joemat    schedule 21.04.2015
comment
Это хорошо, если вам нужно отправить целую директорию. Для одного файла ответ Эрика проще. - person Kelvin; 06.08.2015
comment
@Kelvin: Но tar также сохраняет атрибуты и имя файла. Среди прочего, это означает, что вам нужно ввести имя только один раз (и там вы получите завершение табуляции из своей оболочки). Поэтому я бы сказал, что tar на самом деле проще, если он установлен в контейнере. - person Maarten; 06.08.2015
comment
-f - немного избыточен, по умолчанию все равно выполняется запись в stdout. - person Maarten; 06.08.2015
comment
это означает, что существует зависимость хоста от tar - person cellige; 25.02.2016
comment
Вы правы - вам нужно, чтобы tar был установлен на хосте и внутри контейнера. В настоящее время лучшим решением является использование docker cp. - person joemat; 25.02.2016

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

docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH

На основе ответа Эрика и комментариев Микла и z0r.

person Andrea    schedule 01.07.2015
comment
В принятых решениях иногда нарушаются отступы файлов при переносе в запущенные контейнеры. Это идеально подходит для таких случаев. - person Dreams; 08.08.2019

Это прямой ответ на вопрос «Копирование файлов с хоста в контейнер Docker», поднятый в этом вопросе в заголовке.

Попробуйте docker cp. Это самый простой способ сделать это, и он работает даже на моем Mac. Использование:

docker cp /root/some-file.txt some-docker-container:/root

Это скопирует файл some-file.txt из каталога /root на вашем хост-компьютере в контейнер Docker с именем some-docker-container в каталог /root. Он очень близок к синтаксису безопасного копирования. И, как показано в предыдущем посте, вы можете использовать его наоборот. То есть вы также копируете файлы из контейнера на хост.

И перед тем, как ссылаться на этот пост, введите docker cp --help. Чтение документации может быть очень полезным, иногда ...

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

person Hiro.Protagonist    schedule 23.09.2015

Я пробовал большинство решений (за которые проголосовали) здесь, но в docker 17.09 (в 2018 году) больше нет папки / var / lib / docker / aufs.

Этот простой docker cp решил эту задачу.

docker cp c:\path\to\local\file container_name:/path/to/target/dir/

Как получить имя_контейнера?

 docker ps 

Есть NAMES раздел. Не используйте aIMAGE.

person Aerin    schedule 17.01.2018

В Docker 1.8 docker cp может копировать файлы с хоста в контейнер. См. Сообщение в блоге Docker Представляем Docker 1.8: Content Trust, Toolbox и обновления реестра и оркестровки.

person joemat    schedule 12.08.2015
comment
вот пример docker cp foo.txt mycontainer:/foo.txt - person lockwobr; 07.10.2015

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

docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}

Например,

docker cp /home/foo container-id:/home/dir

Чтобы получить идентификатор контейнера, введите данную команду:

docker ps

Приведенное выше содержимое взято с docker.com.

person prayagupd    schedule 01.12.2016

Предполагая, что контейнер уже запущен, введите данную команду:

# cat /path/to/host/file/ | docker exec -i -t <container_id> bash -c "/bin/cat > /path/to/container/file"

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

# docker run -v /path/to/host/dir:/path/to/container/dir ...

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

person johndodo    schedule 12.11.2014
comment
Дополнительно: docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/ - person Mikl; 13.11.2014
comment
Обратите внимание, что cat не будет завершен после выхода. Если это важно для вас (если вы копируете сценарии bash, bash откажется их запускать), вам следует запустить lsof | grep yourfilename и убить процесс cat, содержащий указанный файл. - person johndodo; 14.11.2014
comment
Спасибо! Отличный совет. Подскажите, пожалуйста, как убить этот процесс одной командой? Что-то вроде kill $(lsof | grep /path/to/file | sed ...). Буду благодарен за вашу помощь - person Mikl; 14.11.2014

Это команда для копирования данных из Docker в Host:

docker cp container_id:file path/filename /hostpath

docker cp a13fb9c9e674:/tmp/dgController.log /tmp/

Ниже приведена команда для копирования данных с хоста на докер:

docker cp a.txt ccfbeb35116b:/home/
person Maninder    schedule 28.02.2019

В среде docker все контейнеры находятся в каталоге:

/var/lib/docker/aufs/required-docker-id/

Чтобы скопировать исходный каталог / файл в любую часть контейнера, введите данную команду:

sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/

person 0x3bfc    schedule 27.05.2015

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

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

docker cp host_source_path container:destination_path

Сначала перечислите ваши запущенные контейнеры, используя команду docker ps:

abhishek@linuxhandbook:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              
  PORTS               NAMES
  8353c6f43fba        775349758637        "bash"              8 seconds ago       Up 7 
  seconds                            ubu_container

Вам нужно знать либо идентификатор контейнера, либо имя контейнера. В моем случае имя контейнера докеров - ubu_container. а идентификатор контейнера - 8353c6f43fba.

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

docker exec -it ubu_container bash

Копирование файлов из хост-системы в контейнер докеров Копирование с помощью docker cp аналогично команде копирования в Linux.

Я собираюсь скопировать файл с именем a.py в каталог home / dir1 в контейнере.

docker cp a.py ubu_container:/home/dir1

Если файл успешно скопирован, вы не увидите никаких результатов на экране. Если целевой путь не существует, вы увидите сообщение об ошибке:

abhishek@linuxhandbook:~$ sudo docker cp a.txt ubu_container:/home/dir2/subsub
        Error: No such container:path: ubu_container:/home/dir2

Если целевой файл уже существует, он будет перезаписан без предупреждения.

Вы также можете использовать идентификатор контейнера вместо имени контейнера:

docker cp a.py 8353c6f43fba:/home/dir1
person Abhishek Patwa    schedule 26.02.2020

Если хост - CentOS или Fedora, прокси НЕ находится в /var/lib/docker/aufs, но он находится в /proc:

cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/root

Этот cmd скопирует все содержимое каталога data в / контейнера с идентификатором "containerid".

person Abdennour TOUMI    schedule 24.02.2016
comment
Это не уникально для Redhat: оно также работает в Debian. (возможно, все Gnu / Linux с /proc). Также расширьте путь, чтобы поместить файл в другое место, а не только в root. - person ctrl-alt-delor; 13.02.2017

tar и docker cp - хорошая комбинация для копирования всего в каталоге.

Создать контейнер тома данных

docker create --name dvc --volume /path/on/container cirros

Чтобы сохранить иерархию каталогов

tar -c -C /path/on/local/machine . | docker cp - dvc:/path/on/container

Проверьте свою работу

docker run --rm --volumes-from dvc cirros ls -al /path/on/container
person Everett Toews    schedule 09.05.2016

Если кому-то вроде меня непонятно, что означает mycontainer в ответе @ h3nrik, на самом деле это идентификатор контейнера. Чтобы скопировать файл WarpSquare.mp4 в /app/example_scenes/1440p60 из завершенного контейнера докеров в текущую папку, я использовал это.

docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .

где docker ps -q -l выводит идентификатор контейнера последнего завершенного экземпляра. Если это не закрытый контейнер, вы можете получить его по docker container ls или docker ps

person ishandutta2007    schedule 08.08.2018
comment
Вы можете перечислить идентификаторы закрытых контейнеров с помощью docker ps -a или docker container ls -a. - person 0x7d7b; 08.08.2018

docker cp SRC_PATH CONTAINER_ID:DEST_PATH

Например, я хочу скопировать свой файл xxxx / download / jenkins в tomcat

Начинаю получать id контейнера Tomcat

docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
63686740b488        tomcat              "catalina.sh run"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->8080/tcp   peaceful_babbage

docker cp xxxx/download/jenkins.war  63686740b488:usr/local/tomcat/webapps/
person Mourad MAMASSI    schedule 03.01.2020

Синтаксис контейнера вверх:

docker run -v /HOST/folder:/Container/floder 

В файле докеров

COPY hom* /myFolder/        # adds all files starting with "hom"
COPY hom?.txt /myFolder/    # ? is replaced with any single character, e.g., "home.txt"
person Isura Nimalasiri    schedule 19.07.2018

Многие, которые задаются этим вопросом, могут столкнуться с проблемой копирования файлов в образ Docker во время его создания (у меня это было).

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

См. документацию.

person Klas Mellbourn    schedule 11.06.2015

Вы можете просто отследить IP-адрес вашего локального компьютера, используя

ifconfig

Затем просто войдите в свой контейнер Docker и введите

scp user_name@ip_address:/path_to_the_file destination

В любом случае, если у вас не установлены клиент и сервер SSH, просто установите его, используя:

sudo apt-get install openssh-server
person Harshit Anand    schedule 31.07.2015
comment
Большое спасибо, у меня это сработало. Кроме того, я нашел это более эффективным, чем другие способы - person user1314742; 12.08.2015
comment
Это ужасное решение с точки зрения безопасности. - person ; 24.10.2018

Это онлайн-приложение для копирования одного файла при запуске контейнера tomcat.

docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

Это скопирует файл войны в каталог webapps и мгновенно запустит ваше приложение.

person karthik101    schedule 24.10.2017
comment
-v будет монтировать (т.е. создавать ссылку), а не копировать - person Vitaliy Ulantikov; 03.12.2017
comment
разница в результате заключается в том, что при установке скрывается предыдущее содержимое контейнера, например если вы монтируете папку хоста в папку контейнера, вы больше не можете видеть содержимое предыдущей папки контейнера - person mrq; 14.03.2018

Мой любимый метод:

КОНТЕЙНЕРЫ:

CONTAINER_ID=$(docker ps | grep <string> | awk '{ print $1 }' | xargs docker inspect -f '{{.Id}}')

file.txt

mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txt

or

mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
person user3159411    schedule 16.01.2015
comment
Путь к устройству не работает в Fedora с docker 1.6. Поместите его как отдельный Q, stackoverflow .com / questions / 29939419 /, любые комментарии приветствуются. - person Yogesh_D; 29.04.2015

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

person Prakash Varandani    schedule 31.07.2014

Есть хорошие ответы, но слишком конкретные. Я обнаружил, что docker ps - хороший способ получить интересующий вас идентификатор контейнера. Затем выполните

mount | grep <id>

чтобы увидеть, где установлен том. Это

/var/lib/docker/devicemapper/mnt/<id>/rootfs/

для меня, но это может быть другой путь в зависимости от ОС и конфигурации. Теперь просто скопируйте файлы по этому пути.

Использование -v не всегда практично.

person akostadinov    schedule 12.11.2014

Я только начал использовать докер для компиляции VLC, вот что вы можете сделать, чтобы копировать файлы туда и обратно из контейнеров:

su -
cd /var/lib/docker
ls -palR > /home/user/dockerfilelist.txt

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

Там может быть путь со словом "merged", я думаю, вам нужен путь с "diff" в нем.

Также, если вы выйдете из контейнера и захотите вернуться с того места, на котором остановились:

docker ps -a
docker start -i containerid

Думаю, это полезно, когда вы ничего не назвали с помощью такой команды, как

docker run -it registry.videolan.org:5000/vlc-debian-win64 /bin/bash

Конечно, хакерский метод, но что с того!

person colin lamarre    schedule 27.04.2019

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

person h.aittamaa    schedule 16.05.2018
comment
Это похоже на угрозу безопасности и кошмар доступа, ожидающий своего часа. Как вы предоставляете доступ к репозиторию git из вашего образа? Даже если предположить, что это общедоступный репозиторий, вы предполагаете, что хост, на котором работает ваш контейнер, имеет доступ к этому репозиторию. - person tbm; 27.03.2019
comment
Я согласен с вами, если git используется внутри контейнера докеров. Но в нашем случае скрипт запускается с хост-машины. - person h.aittamaa; 29.03.2019

Это то, что сработало для меня

#Run the docker image in detached mode 
$docker run -it -d test:latest bash

$ docker ps
CONTAINER ID        IMAGE               COMMAND
a6c1ff6348f4        test:latest     "bash"

#Copy file from host to container
sudo docker cp file.txt a6c1ff6348f4:/tmp

#Copy the file from container to host
docker cp test:/tmp/file.txt /home
person Jafar Karuthedath    schedule 07.04.2021

Если у вас нет каталога, определенного как том в Dockerfile, будет работать / var / lib / docker / aufs / mnt //. Но бывают случаи, когда каталог внутри контейнера определяется как том. В этом случае содержимое в aufs / mnt / * / и содержимое, видимое контейнером, различаются.

Вам нужно будет проверить контейнер с помощью docker inspect, а затем найти тома. Там вы найдете упоминание о чем-то вроде / var / lib / docker / vfs / dir / fe940b ... (идентификатор). Вам нужно будет добавить / изменить файлы здесь, а не в aufs / mnt / *.

Непонятная часть заключается в том, что файлы также находятся в / aufs / mnt / *. Я долго ломал голову, почему изменения здесь не помогли мне. Надеюсь, это кому-то поможет.

person user3392439    schedule 28.09.2014

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

docker run -d -v /blah1/blah2:/mnt --name mntcontainer ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

тогда

docker exec -it mntcontainer bash
person East2West    schedule 31.01.2016

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

С вашего хоста запустите:

scp FILE_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp foo.txt 172.17.0.2:foo.txt

В случае, если вам нужно скопировать каталог:

scp -r DIR_PATH_ON_YOUR_HOST IP_CONTAINER:DESTINATION_PATH
scp -r directory 172.17.0.2:directory

не забудьте также установить ssh в свой контейнер.

apt-get install openssh-server
person gaetano    schedule 29.08.2016
comment
У меня не было проблем с использованием docker cp для копирования папок. В качестве побочного примечания для других, я обычно не люблю читать документы, потому что они часто трудны для понимания, но документы по команде docker cp просты. - person Post Impatica; 27.08.2017

Я просто копирую файл прямо из того места, где находится контейнер, с хост-машины.

Например:

Сначала узнайте идентификатор контейнера:

root@**3aed62678d54**:/home#

А затем с хоста, допустим, файл находится в домашнем каталоге:

root@saasdock:/home/dnepangue# cp cheering_nasa.gif /var/lib/docker/aufs/mnt/**3aed62678d54**a5df47a4a00a58bb0312009c2902f8a37498a1427052e8ac454b/home/

Вернуться к контейнеру ...

root@**3aed62678d54**:/home# ls cheering_nasa.gif
person asterinux    schedule 09.07.2014

При использовании Windows в качестве хоста вы можете использовать WinSCP для подключения к Docker и передачи файлов через графический интерфейс. .

В Linux команда scp также будет работать через терминал.

person R.K    schedule 28.01.2017

Одна вещь, которую я пробовал, и она сработала

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

cd / var / lib / docker / aufs / container / идентификатор_контейнера / tmp

Попробуй один раз!

person Harshal Vaidya    schedule 02.08.2017

Самый простой способ добиться этого -

  1. Найдите идентификатор контейнера
  2. docker cp <filename> <container-id>:<path>
person Soumyajit    schedule 06.12.2019
comment
Каким будет действительный путь Windows в контейнере Docker? я использую C: \ или C: / - person software is fun; 09.03.2020
comment
Для окон я думаю, что это C: \, но если это не сработает, попробуйте C: \\, поскольку одиночный \ используется как символ espace. - person Soumyajit; 17.03.2020

Обычно я создаю сервер python с помощью этой команды

python -m SimpleHTTPServer

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

person terminali    schedule 27.12.2017
comment
docker cp --help - person tbm; 27.03.2019

Скопировать из контейнера в директорию хоста

docker cp [container-name/id]:./app/[index.js] index.js

(предположим, что вы создали рабочий каталог / приложение в своем файле докеров)

Копировать с хоста в контейнер

docker cp index.js [container-name/id]:./app/index.js
person Niyas Ali    schedule 28.05.2020

реальная сделка это:

docker volume create xdata
docker volume inspect xdata

так что вы видите его mount poit dir.
просто скопируйте туда свои файлы
затем

docker run  --name=example1 --mount source=xdata,destination=/xdata -it yessa bash

где yessa - имя изображения

person Алексей Неудачи&    schedule 15.02.2021

Если вы можете использовать реестр контейнеров, сценарий appendlayer сделает то, о чем вы просите:

Предположим, что ubuntu:base уже доступен в реестре.

Затем вы можете добавить новый слой, состоящий из некоторых локальных файлов поверх него, используя скрипт, сохранив все это как новое изображение (т.е. ubuntu:test).

$ tar cvf - test.txt | python main.py <host> <repository> <old-tag> <new-tag>

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

person malthe    schedule 20.05.2021

Я хотел, чтобы процесс сборки происходил в контейнере без файлов, таких как папка .git, но мне нужны эти файлы, когда я запускаю контейнер в интерактивном режиме для устранения проблем. Как и ответ Бена Дэвиса, это выполняет копию файла в контейнере. Но я не хочу, чтобы мне приходилось запускать эту команду сам, когда я вхожу в контейнер. Таким образом, следующий сценарий поможет:

# mount the current [project] directory as read only
docker run --name my_container -v $(pwd):/mnt/application:ro -itd my_image /bin/bash
# copy the missing project files from the mounted directory
docker exec -it my_container /bin/bash -c 'cp -rnT /mnt/application $HOME/application'
# interactively use the container
docker attach my_container

Остается my_container экземпляр контейнера. Чтобы снова запустить команду, вам нужно будет написать docker rm my_container. Или вместо этого, если вы хотите снова попасть в этот экземпляр контейнера, вы можете выполнить docker start my_container && docker attach my_container.

Обратите внимание на флаг cp -n, который предотвращает перезапись файлов, если они уже существуют в месте назначения. Часть :ro не позволяет изменять файлы хоста. И вы можете изменить $(pwd) на определенный каталог, например /home/user/dev/application.

person Erasmus    schedule 26.05.2021

Попробуйте docker cp.

Использование:

docker cp CONTAINER:PATH HOSTPATH

Он копирует файлы / папки из PATH в HOSTPATH.

person ganga    schedule 13.01.2015
comment
Он спрашивает от хоста к контейнеру, а не наоборот. - person rollingBalls; 09.02.2015