Копирование файлов с хоста в контейнер Docker
Я пытаюсь создать решение для резервного копирования и восстановления контейнеров Docker, с которыми мы работаем.
У меня есть Докер базовый образ, который я создал,ubuntu:base, и не нужно перестраивать его каждый раз с помощью файла Docker, чтобы добавить к нему файлы.
Я хочу создать скрипт, который работает с хост-машины и создает новый контейнер с помощью ubuntu:base Docker image, а затем копирует файлы в этот контейнер.
Как я могу скопировать файлы с хоста контейнер?
30 ответов:
The может быть использована для копирования файлов. Один конкретный файл может быть скопирован следующим образом:
docker cp foo.txt mycontainer:/foo.txt docker cp mycontainer:/foo.txt foo.txtдля акцента,
mycontainer- это контейнер ID,не an изображения ID.несколько файлов, содержащихся в папке
srcможно скопировать вtargetпапка с помощью:docker cp src/. mycontainer:/target docker cp mycontainer:/src/. targetссылки: Docker CLI docs for
cpв версиях Docker до 1.8 это было только возможно копирование файлов из контейнера на хост. Не от хоста к контейнеру.
получить имя контейнера или короткий идентификатор контейнера:
$ docker psполучить полный идентификатор контейнера:
$ docker inspect -f '{{.Id}}' SHORT_CONTAINER_ID-or-CONTAINER_NAMEскопировать файл:
$ 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
самый чистый способ-смонтировать каталог хоста на контейнере при запуске контейнера:
{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
следующий довольно уродливый способ сделать это, но он работает.
docker run -i ubuntu /bin/bash -c 'cat > file' < file
Если вам нужно сделать это на работающем контейнере, вы можете использовать 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
решение приведено ниже,
из оболочки Докера,
root@123abc:/root# <-- get the container IDот ведущего
cp thefile.txt /var/lib/docker/devicemapper/mnt/123abc<bunch-o-hex>/rootfs/rootфайл должен быть скопирован в папку, где контейнер находится в файловой системе.
другое решение для копирования файлов в контейнер с помощью команды tar:
tar -c foo.sh | docker exec -i theDockerContainer /bin/tar -C /tmp -xкопирует файл
foo.shна/tmpконтейнера.изменить: удалить reduntant
-f, спасибо Маартенs комментарий.
очень просто
создайте новый dockerfile и используйте существующий образ в качестве базы.
FROM myName/myImage:latest ADD myFile.py bin/myFile.pyзатем построить контейнера:
docker build .
скопировать файл от хоста к запущенному контейнеру
docker exec -i $CONTAINER /bin/bash -c "cat > $CONTAINER_PATH" < $HOST_PATH
на основе Эрика и комментарии Микла и z0r.
С Docker 1.8,
docker cpумеет копировать файлы с хоста в контейнер. Смотрите в блоге "докер" в должности объявление Docker 1.8: доверие к контенту, Toolbox и обновления реестра и оркестровки.
это прямой ответ на вопрос "копирование файлов с хоста в контейнер 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?.
предполагая, что контейнер уже запущен, введите данную команду:
# 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 ...Примечание: проблемы с разрешениями могут возникнуть, поскольку пользователи контейнера не совпадают с пользователями узла.
в среде docker все контейнеры находятся в каталоге:
/var/lib/docker/aufs/required-docker-id/чтобы скопировать исходный каталог / файл в любую часть контейнера, введите следующую команду:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
скопировать файлы/папки между контейнером и локальной файловой системы, введите команду:
docker cp {SOURCE_FILE} {DESTINATION_CONTAINER_ID}:/{DESTINATION_PATH}например,
docker cp /home/foo container-id:/home/dirчтобы получить идентификатор contianer, введите следующую команду:
docker psвыше содержание берется из docker.com.
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
вы можете просто отслеживать IP-адрес вашей локальной машины с помощью
ifconfigзатем просто войдите в свой контейнер Docker и введите
scp user_name@ip_address:/path_to_the_file destinationв любом случае, если у вас нет установленного SSH-клиента и сервера, просто установите его с помощью:
sudo apt-get install openssh-server
Я пробовал большинство (загруженных) решений здесь, но в docker 17.09 (в 2018 году) больше нет папки /var/lib/docker/aufs.
Это просто
docker cpрешить эту задачу.docker cp c:\path\to\local\file container_name:/path/to/target/dir/как получить имя контейнера? (Есть . Не используйте
IMAGE.)docker ps
многие, которые находят этот вопрос, на самом деле могут иметь проблему копирования файлов в изображение Docker пока он создается (Я сделал).
в этом случае, вы можете использовать на
Dockerfileчто вы используете для создания образа.
если хост CentOS или Fedora, есть прокси не в
/var/lib/docker/aufs, но он находится под/proc:cp -r /home/user/mydata/* /proc/$(docker inspect --format "{{.State.Pid}}" <containerid>)/rootэтот cmd скопирует все содержимое до
/контейнера с идентификатором "containerid".
лучший способ копирования файлов в контейнер, который я нашел, - это установка каталога на хосте с помощью
-vопция команды запуска docker.
есть хорошие ответы, но слишком конкретные. Я узнаю, что
docker psэто хороший способ получить идентификатор контейнера, который вас интересует. Тогда сделайmount | grep <id>чтобы увидеть, где установлен том. Это
/var/lib/docker/devicemapper/mnt/<id>/rootfs/для меня, но это может быть другой путь в зависимости от операционной системы и конфигурации. Теперь просто скопируйте файлы на этот путь.
используя
-v- это не всегда практично.
Я просто копирую файл непосредственно из того места, где находится контейнер с хост-машины.
например:
сначала узнайте идентификатор контейнера:
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
Если вы используете Windows в качестве хоста, вы можете использовать WinSCP для подключения к Docker и передачи файлов через GUI.
Если на Linux, то также будет работать через терминал.
это onliner для копирования одного файла при запуске контейнера tomcat.
docker run -v /PATH_TO_WAR/sample.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcatЭто позволит скопировать файл War в webapps и получить ваше приложение работает в кратчайшие сроки.
в случае, если кому-то вроде меня не ясно, что
mycontainerв @h3nrik ответ означает, что на самом деле это идентификатор контейнера. Чтобы скопировать файлWarpSquare.mp4на/app/example_scenes/1440p60вышел из контейнера Docker в текущую папку, я использовал это.docker cp `docker ps -q -l`:/app/example_scenes/1440p60/WarpSquare.mp4 .здесь
docker ps -q -lвыводит идентификатор контейнера последнего завершенного экземпляра. В случае, если это не выходной контейнер, вы можете получить его с помощьюdocker container lsилиdocker ps
Если у вас нет каталога, определенного Как том в файле Dockerfile, будет работать /var/lib/docker/aufs/mnt//. Но есть случаи, когда каталог в контейнере определяется как Том. В этом случае содержимое под aufs/mnt/*/ и содержимое, видимое контейнером, отличаются.
вам нужно будет проверить контейнер с помощью docker inspect, а затем искать Тома. Там вы найдете упоминание о чем-то вроде /var/lib/docker/vfs/dir/fe940b... (идентификатор.) Вам нужно будет добавить/изменить файлы здесь, а не под aufs/mnt/*.
запутанная часть заключается в том, что файлы также отображаются под /aufs/mnt/*. Я провел довольно много времени, почесывая голову, почему изменения здесь не сработали для меня. Надеюсь, это кому-то поможет.
мой любимый метод:
тара
.txtCONTAINER_ID=$(docker ps | grep <string> | awk '{ print }' | xargs docker inspect -f '{{.Id}}')mv -f file.txt /var/lib/docker/devicemapper/mnt/$CONTAINER_ID/rootfs/root/file.txtили
mv -f file.txt /var/lib/docker/aufs/mnt/$CONTAINER_ID/rootfs/root/file.txt
Я бы смонтировал, а затем запустил образ с демоном, просто любой, как указано здесь;
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
другой обходной путь использует старый добрый
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
одна вещь, которую я пробовал и он работал
после того, как вы развернете свой контейнер docker, и если вы создадите какой-либо файл под этим контейнером; вы можете легко получить доступ к этому файлу снизу расположение вашего хоста docker: -
cd/var/lib/docker/aufs/containers/container_id / tmp
один раз попробовать!
Comments