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


Answers

  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

или

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

d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5

$ sudo cp file.txt /var/lib/docker/aufs/mnt/**d8e703d7e3039a6df6d01bd7fb58d1882e592a85059eb16c4b83cf91847f88e5**/root/file.txt
Question

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

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

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

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




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

# 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 ...

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







Решение приведено ниже,

Из оболочки Докера,

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

От хоста

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

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




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

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

Основываясь на ответах Эрика и комментариях Микла и z0r.




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

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

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




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

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

Например,

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

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

docker ps

Вышеуказанный контент взят из docker.com .




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

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

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




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



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

Например:

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

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



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

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

cd / var / lib / docker / aufs / container / container_id / tmp

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




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

python -m SimpleHTTPServer

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




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

mount | grep <id>

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

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

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

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




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

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



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

docker run -i ubuntu /bin/bash -c 'cat > file' < file





Links