Добавить файл в docker
I am trying to build a backup and restore solution for the Docker containers that we work with.
I have Docker base image that I have created, ubuntu:base , and do not want have to rebuild it each time with a Docker file to add files to it.
I want to create a script that runs from the host machine and creates a new container using the ubuntu:base Docker image and then copies files into that container.
How can I copy files from the host to the container?
Just a remark on a notion nobody has addressed: in general, treat containers as "ephemeral". There ARE use cases to copy files into/from a running container (testing, prototyping). But if you find yourself in a position where you can't rebuild what you need using Dockerfiles and/or compose, then you may be in a bad place. You generally don't want to be backing up containers as if they were OS or even VM objects. Generally speaking :-)
51 Answers 51
The cp command can be used to copy files.
One specific file can be copied TO the container like:
One specific file can be copied FROM the container like:
For emphasis, container_id is a container ID, not an image ID. (Use docker ps to view listing which includes container_id s.)
Multiple files contained by the folder src can be copied into the target folder using:
In Docker versions prior to 1.8 it was only possible to copy files from a container to the host. Not from the host to a container.
also note this can be on the host vm or main OS and works either host to container or vm to host (or main os)
use docker cp to copy from container to host works well, but when use it to copy files from host to container, no effect. anybody know why ? docker version: Docker version 1.10.3, build cb079f6-unsupported
Get container name or short container id:
Get full container id:
EXAMPLE:
For me the host's mounting path didn't contain aufs but a devicemapper . Easiest way to check the containers mounting path (while it is running) is to run the command mount .
I tried the above solution. It copied the files into the docker specific directory. However, when I use bash for docker container, the files dont show up there. Is there something I am missing ?
what about for poor MacOS users? The mount directory is in /var/lib for me. find / -name docker was not helpful either.
The cleanest way is to mount a host directory on the container when starting the container:
The only way this worked for me was attaching the volume alongside running the image (instantiating the container). Ended up with: docker run -d -p -v /host/path:/mnt --name container_name image_name
The following is a fairly ugly way of doing it but it works.
This works great! But don't forget to commit the change: docker commit `docker ps -l -q` ubuntu-with-file . Else the change will be lost (use whatever name you want instead of ubuntu-with-file )
In adition, we can use new docker exec feature to work with running container: docker exec -it
@Mikl I think it should be docker exec -i . instead of -it , because there's no TTY when piping in from a file.
If you are still stuck on an old version of Docker (as I am) and want to copy a whole directory, you could do this: tar -c -v -f - /path/to/host/directory | docker exec -i
Hmm, this did not work for me with Docker 19.03.8, host Centos 8, ubuntu:18.04 image. It did create file on the container, but it was blank.
Typically there are three types:
From a container to the host
From the host to a container
Second approach to copy from host to container:
From a container to a container mixes 1 and 2
docker cp works both ways. No need to exec, cat, and redirect. docker cp host_file.txt container:/path/
And if the requirements is to copy more than just one file, tar comes pretty handy, something like the following: 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
If you need to do this on a running container you can use docker exec (added in 1.3).
First, find the container's name or ID:
In the example above we can either use b9b7400ddd8f or elated_hodgkin .
If you wanted to copy everything in /tmp/somefiles on the host to /var/www in the container:
We can then exec /bin/bash in the container and verify it worked:
Create a new dockerfile and use the existing image as your base.
Then build the container:
It will create a new image, not directly a new container. If you reuse this image while myFile.py as changed, it will use the older version of the file, unless you rebuild the image.
According to this most people should use COPY rather than ADD. But for local files (as in this example) they're equivalent.
The solution is given below,
из оболочки Докера,
7 Answers 7
Use COPY command like this:
read more details for COPY in the official documentation
An alternative would be to use ADD but this is not the best practise if you dont want to use some advanced features of ADD like decompression of tar.gz files.If you still want to use ADD command, do it like this:
read more details for ADD in the official documentation
Unfortunately no, you can only add files from the folder of your Dockerfile or subfolders of it. Also, soft links will not work either. This is due to the docker build process. Building starts by compressing the directory where Dockerfile resides to an archive and uses this archive to retrieve files used in ADD/COPY commands.
thanks, I wrote a shell script to automate that part. It would have been better if I could handle that through Dockerfile.
For those who get this (terribly unclear) error:
COPY failed: stat /var/lib/docker/tmp/docker-builderXXXXXXX/abc.txt: no such file or directory
There could be loads of reasons, including:
Sometimes WORKDIR /abc followed by COPY . xyz/ works where COPY /abc xyz/ fails, but it's a bit ugly.
I faced this issue, I was not able to copy zeppelin [1GB] directory into docker container and was getting issue
COPY failed: stat /var/lib/docker/tmp/docker-builder977188321/zeppelin-0.7.2-bin-all: no such file or directory
I am using docker Version: 17.09.0-ce and resolved the issue with the following steps.
Step 1: copy zeppelin directory [which i want to copy into docker package]into directory contain "Dockfile"
Step 2: edit Dockfile and add command [location where we want to copy] ADD ./zeppelin-0.7.2-bin-all /usr/local/
Step 3: go to directory which contain DockFile and run command [alternatives also available] docker build
Step 4: docker image created Successfully with logs
Step 5/9 : ADD ./zeppelin-0.7.2-bin-all /usr/local/ ---> 3691c902d9fe
Step 6/9 : WORKDIR $ZEPPELIN_HOME ---> 3adacfb024d8 . Successfully built b67b9ea09f02
I have a Dockerfile where I copy an existing directory (with content) to the container which works fine:
Dockerfile
But when I use a docker-compose.yml file there is only the directory aw3somevideo and inside aw3somevideo there is nothing.
docker-compose.yml:
Maybe I do not understand the function of volumes and if that's the case please tell me how to copy my existing files to the container via a docker-compose.yml file.
Remove your volumes: section from your docker-compose file. Your image already has the data. The volumes: section just overwrites the data. Also move to the current docker-compose format (version 2).
I think host machine‘folder will cover folder in container.I also find some way to copy container'folder to my host machine.
The title of this question is very misleading. It says that the topic is about copying files to a container with docker-compose, but neither the question nor any of the answers is actually about how to do this.
From the Docker shell,
3 Answers 3
if /dir/on/host doesn't exist, it is created on the host and the empty content is mounted in the container at /var/www/html . Whatever content you had before in /var/www/html inside the container is inaccessible, until you unmount the volume; the new mount is hiding the old content.
Is it possible, that with recent docker versions the content of var/www/html/ is not copied anymore to /dir/on/host even when it doesn't exist? Is there a way to force-copy the data from within the docker-container to the host when atarting a container the first time?
@Tarator yes indeed, the right hand side is not copied to the host anymore. I'll update the answer. As for a way to copy on container start, you can override the startup command with something like this docker run -v /dir/on/host:/hostdir php sh -c "cp -rp /var/www/html/* /hostdir && exec myapp" . Don't forget to use exec to invoke the final command so that it is assigned PID1. That will make sure that myapp receives termination signals (Ctrl-C for instance).
Hey, Bernard, in your answer you refer to "whether the right hand side specifies a named volume like myvolume or a path on the host". Didn't you mean "left hand" there, since that's where one designates either a volume or host path, which is then mapped to the container location on the rhs? I do realize you're talking about how Docker may manage file copying between the left and right, and how it's changed.
Preface: I realize this question is quite old and that the OP may have found a workaround but because I do not see an accurate answer, I felt it appropriate to address the questions posed by the OP as well as any related issues.
First, clarifying the distinction between named volumes and bind mounts. The former will allow you to see, from outside the container, files that already exist in the container location whereas the latter will not. In essence, bind mounts operate very much like when mounting a volume in xNIX meaning that any files already in the mount location will be masked after a device is mounted - think of it as an overlay.
Next, when you specify ./Frontend/ :/var/www/html/ , you are specifying a bind mount which is why when you look in ./Frontend on the host-side, all of the files you expect to see are gone. If I understand your end-goal correctly, you want to have the files in /var/www/html/ within the container be accessible via the exact same location outside of the container. If so, then you probably want to use a named volume along with a user-specified mount point as follows:
Be aware that without the driver_opts listed above, the named volume will still exist but the host-side location will be in the Docker area. This is typically something like /var/lib/docker/volumes or similar. The exact location can be found in the Mounts section of the docker inspect command.
пример:
самый чистый способ-смонтировать каталог хоста на контейнере при запуске контейнера:
следующее-довольно уродливый способ сделать это, но он работает.
Если вам нужно сделать это на работающем контейнере, вы можете использовать docker exec (добавлено в 1.3).
сначала найдите имя или идентификатор контейнера:
в приведенном выше примере мы можем либо использовать b9b7400ddd8f или elated_hodgkin .
если вы хотите скопировать все в /tmp/somefiles на узле /var/www в контейнере:
мы можем тогда exec /bin/bash в контейнере и убедитесь, что он работал:
решение приведено ниже,
From the host
The file shall be directly copied to the location where the container sits on the filesystem.
Another solution for copying files into a running container is using tar:
Copies the file foo.sh into /tmp of the container.
Edit: Remove reduntant -f , thanks to Maartens comment.
@Kelvin: But tar also preserves file attributes and name. Amongst others that means you only have to type the name once (and there you get tab completion from your shell). So I'd say tar is actually simpler, as long as it is installed in the container.
You are right - you need tar to be installed on the host and within the container. Nowadays using docker cp is the better solution.
To copy a file from host to running container
Based on Erik's answer and Mikl's and z0r's comments.
The accepted solutions sometimes disturbs the indentation of files when transferring to running containers. This works perfect for such cases
This is a direct answer to the question 'Copying files from host to Docker container' raised in this question in the title.
Try docker cp . It is the easiest way to do that and works even on my Mac. Usage:
This will copy the file some-file.txt in the directory /root on your host machine into the Docker container named some-docker-container into the directory /root . It is very close to the secure copy syntax. And as shown in the previous post, you can use it vice versa. I.e., you also copy files from the container to the host.
And before you downlink this post, please enter docker cp --help . Reading the documentation can be very helpful, sometimes.
If you don't like that way and you want data volumes in your already created and running container, then recreation is your only option today. See also How can I add a volume to an existing Docker container?.
I tried most of the (upvoted) solutions here but in docker 17.09 (in 2018) there is no longer /var/lib/docker/aufs folder.
This simple docker cp solved this task.
How to get container_name?
There is a NAMES section. Don't use a IMAGE .
With Docker 1.8, docker cp is able to copy files from host to container. See the Docker blog post Announcing Docker 1.8: Content Trust, Toolbox, and Updates to Registry and Orchestration.
To copy files/folders between a container and the local filesystem, type the command:
To get the contianer id, type the given command:
Assuming the container is already running, type the given command:
To share files using shared directory, run the container by typing the given command:
Note: Problems with permissions might arise as container's users are not the same as the host's users.
Note that cat will not be terminated once it exits. If it matters to you (if you are copying bash scripts, bash will refuse to run them), you should run lsof | grep yourfilename and kill the cat process that holds the said file.
Thx! Great tip. Can you pls tell me how to kill this process with one command? Something like kill $(lsof | grep /path/to/file | sed . ) . I'll be grateful for your help
This is the command to copy data from Docker to Host:
Below is the command to copy data from host to docker:
In a docker environment, all containers are found in the directory:
To copy the source directory/file to any part of the container, type the given command:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
Docker cp command is a handy utility that allows to copy files and folders between a container and the host system.
If you want to copy files from your host system to the container, you should use docker cp command like this:
List your running containers first using docker ps command:
You need to know either the container ID or the container name. In my case, the docker container name is ubu_container. and the container ID is 8353c6f43fba.
If you want to verify that the files have been copied successfully, you can enter your container in the following manner and then use regular Linux commands:
Copy files from host system to docker container Copying with docker cp is similar to the copy command in Linux.
I am going to copy a file named a.py to the home/dir1 directory in the container.
If the file is successfully copied, you won’t see any output on the screen. If the destination path doesn’t exist, you would see an error:
If the destination file already exists, it will be overwritten without any warning.
В прошлой статье мы рассказали, что такое Docker и как с его помощью можно обойти Vendor–lock. В этой статье мы поговорим о Dockerfile как о правильном способе подготовки образов для Docker. Также мы рассмотрим ситуацию, когда контейнерам нужно взаимодействовать друг с другом.
В InfoboxCloud мы сделали готовый образ Ubuntu 14.04 с Docker. Не забудьте поставить галочку «Разрешить управление ядром ОС» при создании сервера, это требуется для работы Docker.
Dockerfile
Подход docker commit, описанный в предыдущей статье, не является рекомендованным для Docker. Его плюс состоит в том, что мы настраиваем контейнер практически так, как привыкли настраивать стандартный сервер.
Вместо этого подхода мы рекомендуем использовать подход Dockerfile и команду docker build. Dockerfile использует обычный DSL с инструкциями для построения образов Docker. После этого выполняется команда docker build для построения нового образа с инструкциями в Dockerfile.
Написание Dockerfile
Давайте создадим простой образ с веб-сервером с помощью Dockerfile. Для начала создадим директорию и сам Dockerfile.
Созданная директория — билд-окружение, в которой Docker вызывает контекст или строит контекст. Docker загрузит контекст в папке в процессе работы Docker–демона, когда будет запущена сборка образа. Таким образом будет возможно для Docker–демона получить доступ к любому коду, файлам или другим данным, которые вы захотите включить в образ.
Добавим в Dockerfile информацию по построению образа:
- Запуск контейнера из образа
- Исполнение инструкции и внесение изменений в контейнер
- Запуск эквивалента docker commit для записи изменений в новый слой образа
- Запуск нового контейнера из нового образа
- Исполнение следующей инструкции в файле и повторение шагов процесса.
Первая инструкция в Dockerfile всегда должна быть FROM, указывающая, из какого образа нужно построить образ. В нашем примере мы строим образ из базового образа ubuntu версии 14:04.
Далее мы указываем инструкцию MAINTAINER, сообщающую Docker автора образа и его email. Это полезно, чтобы пользователи образа могли связаться с автором при необходимости.
Инструкция RUN исполняет команду в конкретном образе. В нашем примере с помощью ее мы обновляем APT репозитории и устанавливаем пакет с NGINX, затем создаем файл /usr/share/nginx/html/index.html.
По-умолчанию инструкция RUN исполняется внутри оболочки с использованием обертки команд /bin/sh -c. Если вы запускаете инструкцию на платформе без оболочки или просто хотите выполнить инструкцию без оболочки, вы можете указать формат исполнения:
Мы используем этот формат для указания массива, содержащего команду для исполнения и параметры команды.
Далее мы указываем инструкцию EXPOSE, которая говорит Docker, что приложение в контейнере должно использовать определенный порт в контейнере. Это не означает, что вы можете автоматически получать доступ к сервису, запущенному на порту контейнера (в нашем примере порт 80). По соображениям безопасности Docker не открывает порт автоматически, но ожидает, когда это сделает пользователь в команде docker run. Вы можете указать множество инструкций EXPOSE для указания, какие порты должны быть открыты. Также инструкция EXPOSE полезна для проброса портов между контейнерами.
Строим образ из нашего файла
, где trukhinyuri – название репозитория, где будет храниться образ, nginx – имя образа. Последний параметр — путь к папке с Dockerfile. Если вы не укажете название образа, он автоматически получит название latest. Также вы можете указать git репозиторий, где находится Dockerfile.
В данном примере мы строим образ из Dockerfile, расположенном в корневой директории Docker.
Если в корне билд контекста есть файл .dockerignore – он интерпретируется как список паттернов исключений.
Что произойдет, если инструкция не исполнится?
Давайте переименуем в Dockerfile nginx в ngin и посмотрим.
Мы можем создать контейнер из предпоследнего шага с ID образа 066b799ea548
docker run -i -t 066b799ea548 /bin/bash
и отладить исполнение.
По-умолчанию Docker кеширует каждый шаг и формируя кеш сборок. Чтобы отключить кеш, например для использования последнего apt-get update, используйте флаг --no-cache.
Использования кеша сборок для шаблонизации
Используя кеш сборок можно строить образы из Dockerfile в форме простых шаблонов. Например шаблон для обновления APT-кеша в Ubuntu:
Инструкция ENV устанавливает переменные окружения в образе. В данном случае мы указываем, когда шаблон был обновлен. Когда необходимо обновить построенный образ, просто нужно изменить дату в ENV. Docker сбросит кеш и версии пакетов в образе будут последними.
Инструкции Dockerfile
Давайте рассмотрим и другие инструкции Dockerfile. Полный список можно посмотреть тут.
CMD
Инструкция CMD указывает, какую команду необходимо запустить, когда контейнер запущен. В отличие от команды RUN указанная команда исполняется не во время построения образа, а во время запуска контейнера.
В данном случае мы запускаем bash и передаем ему параметр в виде массива. Если мы задаем команду не в виде массива — она будет исполняться в /bin/sh -c. Важно помнить, что вы можете перегрузить команду CMD, используя docker run.
ENTRYPOINT
Часто команду CMD путают с ENTRYPOINT. Разница в том, что вы не можете перегружать ENTRYPOINT при запуске контейнера.
При запуске контейнера параметры передаются команде, указанной в ENTRYPOINT.
Можно комбинировать ENTRYPOINT и CMD.
В этом случае команда в ENTRYPOINT выполнится в любом случае, а команда в CMD выполнится, если не передано другой команды при запуске контейнера. Если требуется, вы все-таки можете перегрузить команду ENTRYPOINT с помощью флага --entrypoint.
WORKDIR
С помощью WORKDIR можно установить рабочую директорию, откуда будут запускаться команды ENTRYPOINT и CMD.
Вы можете перегрузить рабочую директорию контейнера в рантайме с помощью флага -w.
USER
Специфицирует пользователя, под которым должен быть запущен образ. Мы можем указать имя пользователя или UID и группу или GID.
Вы можете перегрузить эту команду, используя глаг -u при запуске контейнера. Если пользователь не указан, используется root по-умолчанию.
VOLUME
Инструкция VOLUME добавляет тома в образ. Том — папка в одном или более контейнерах или папка хоста, проброшенная через Union File System (UFS).
Тома могут быть расшарены или повторно использованы между контейнерами. Это позволяет добавлять и изменять данные без коммита в образ.
В примере выше создается точка монтирования /opt/project для любого контейнера, созданного из образа. Таким образом вы можете указывать и несколько томов в массиве.
ADD
Инструкция ADD добавляет файлы или папки из нашего билд-окружения в образ, что полезно например при установке приложения.
Источником может быть URL, имя файла или директория.
В последнем примере архив tar.gz будет распакован в /var/www/wordpress. Если путь назначения не указан — будет использован полный путь включая директории.
COPY
Инструкция COPY отличается от ADD тем, что предназначена для копирования локальных файлов из билд-контекста и не поддерживает распаковки файлов:
ONBUILD
Инструкция ONBUILD добавляет триггеры в образы. Триггер исполняется, когда образ используется как базовый для другого образа, например, когда исходный код, нужный для образа еще не доступен, но требует для работы конкретного окружения.
Коммуникация между контейнерами
В предыдущей статье было показано, как запускать изолированные контейнеры Docker и как пробрасывать файловую систему в них. Но что, если приложениям нужно связываться друг с другом. Есть 2 способа: связь через проброс портов и линковку контейнеров.
Проброс портов
Такой способ связи уже был показан ранее. Посмотрим на варианты проброса портов чуть шире.
Когда мы используем EXPOSE в Dockerfile или параметр -p номер_порта – порт контейнера привязывается к произвольному порту хоста. Посмотреть этот порт можно командой docker ps или docker port имя_контейнера номер_порта_в_контейнере. В момент создания образа мы можем не знать, какой порт будет свободен на машине в момент запуска контейнера.
Указать, на какой конкретный порт хоста мы привяжем порт контейнера можно параметром docker run -p порт_хоста: порт_контейнера
По-умолчанию порт используется на всех интерфейсах машины. Можно, например, привязать к localhost явно:
Можно привязать UDP порты, указав /udp:
Линковка контейнеров
Связь через сетевые порты — лишь один способ коммуникации. Docker предоставляет систему линковки, позволяющую связать множество контейнеров вместе и отправлять информацию о соединении от одного контейнера другому.
Для установки связи нужно использовать имена контейнеров. Как было показано ранее, вы можете дать имя контейнеру при создании с помощью флага --name.
Допустим у вас есть 2 контейнера: web и db. Чтобы создать связь, удалите контейнер web и пересоздайте с использованием команды --link name:alias.
Используя docker -ps можно увидеть связанные контейнеры.
- Через переменные окружения
- Через /etc/hosts
Префикс DB_ был взят из alias контейнера.
Можно просто использовать информацию из hosts, например команда ping db (где db – alias) будет работать.
Заключение
В этой статье мы научились использовать Dockerfile и организовывать связь между контейнерами. Это только вершина айсберга, очень многое осталось за кадром и будет рассмотрено в будущем. Для дополнительного чтения рекомендуем книгу The Docker Book.
Готовый образ с Docker доступен в облаке InfoboxCloud.
В случае, если вы не можете задавать вопросы на Хабре, можно задать в Сообществе InfoboxCloud.
Если вы обнаружили ошибку в статье, автор ее с удовольствием исправит. Пожалуйста напишите в ЛС или на почту о ней.
Я пытаюсь создать резервную копию и восстановить решение для контейнеров Docker, с которыми мы работаем.
у меня есть базовое изображение Docker, которое я создал, ubuntu:base , и не хотите перестраивать его каждый раз с помощью файла Docker для добавления файлов в него.
Я хочу создать скрипт, который работает с хост-машины и создает новый контейнер с помощью ubuntu:base изображение Docker, а затем копирует файлы в этот контейнер.
Как скопировать файлы с хоста на контейнер?
на cp команда может использоваться для копирования файлов. Один конкретный файл может быть скопирован как:
для акцента, mycontainer - это контейнер ID,не an изображения ID.
несколько файлов, содержащихся в папке src можно скопировать в target папка с помощью:
в версиях Docker до 1.8 это было только возможно копирование файлов из контейнера на хост. Не от хозяина к контейнеру.
получить имя контейнера или короткий идентификатор контейнера:
получить полный идентификатор контейнера:
Example
Here is a similar setup on my PiHole lab host.
docker-compose.yml (abbreviated)
Output of sudo docker inspect , Mount section only (abbreviated)
от ведущего
файл должен быть скопирован непосредственно в то место, где находится контейнер в файловой системе.
другое решение для копирования файлов в контейнер с помощью команды tar:
копирует файл foo.sh на /tmp контейнера.
Edit: удалить reduntant -f , спасибо Маартенs комментарий.
создайте новый файл dockerfile и используйте существующее изображение в качестве базы.
затем создайте контейнер:
скопировать файл от хоста к работающему контейнеру
на основе Эрика и комментарии Микла и z0r.
С Docker 1.8, docker cp умеет копировать файлы с хоста в контейнер. Смотрите в блоге "докер" в должности объявление Docker 1.8: Content Trust, Toolbox и обновления реестра и оркестровки.
это прямой ответ на вопрос "копирование файлов с хоста в контейнер Docker", поднятый в этом вопросе в заголовке.
попробовать docker cp . Это самый простой способ сделать это, и работает даже на моем Mac. Использование:
это скопирует файл some-file.txt в каталоге /root на вашем хост-компьютере в контейнер Docker с именем some-docker-container в каталоге /root . Он очень близок к синтаксису secure copy. И как показано в предыдущем посте, вы можете использовать это наоборот. То есть, вы также копируете файлы из контейнера на хост.
и прежде чем вы перейдете по ссылке этот пост, пожалуйста, введите docker cp --help . Иногда чтение документации может быть очень полезным.
Если вам это не нравится, и вы хотите, чтобы тома данных в вашем уже созданном и запущенном контейнере, то отдых-ваш единственный вариант сегодня. См. также как добавить том в существующий контейнер Docker?.
предполагая, что контейнер уже запущен, введите данную команду:
чтобы поделиться файлами с помощью общего каталога, запустите контейнер, введя данную команду:
Примечание: проблемы с разрешениями могут возникнуть, поскольку пользователи контейнера не совпадают с пользователями хоста.
в среде docker все контейнеры находятся в каталоге:
чтобы скопировать исходный каталог / файл в любую часть контейнера, введите следующую команду:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
скопировать файлы/папки между контейнером и локальной файловой системы, введите команду:
получить идентификатор contianer, введите данную команду:
tar и docker cp являются хорошим комбо для копирования всего в каталоге.
создать контейнер объемом данных
для сохранения иерархии каталогов
проверьте свою работу
вы можете просто отследить IP-адрес локального компьютера, используя
затем просто введите в контейнер Docker и введите
в любом случае, если у вас нет SSH-клиента и сервера, просто установите его с помощью:
Я пробовал большинство (upvoted) решений здесь, но в docker 17.09 (в 2018 году) больше нет папки /var/lib/docker/aufs.
Это просто docker cp решить эту задачу.
как получить имя контейнера? (Есть . Не используйте IMAGE .)
многие, которые находят этот вопрос, могут на самом деле иметь проблему копирования файлов в образ Docker в то время как он создается (Я сделал).
в этом случае, вы можете использовать на Dockerfile что вы используете для создания образа.
если хост CentOS или Fedora, есть прокси не в /var/lib/docker/aufs , но он находится под /proc :
этот cmd скопирует все содержимое до / контейнера с идентификатором "containerid".
лучший способ копирования файлов в контейнер, который я нашел, - это установка каталога на хосте с помощью -v опция команды запуска docker.
есть хорошие ответы, но слишком конкретные. Я узнаю docker ps хороший способ получить идентификатор контейнера, который вас интересует. Тогда сделай
чтобы увидеть, где установлен том. Это
для меня, но это может быть другой путь в зависимости от операционной системы и конфигурации. Теперь просто скопируйте файлы на этот путь.
используя -v - это не всегда практично.
Я просто копирую файл непосредственно из того места, где находится контейнер, с хост-компьютера.
сначала узнайте идентификатор контейнера:
а затем с хоста, скажем, файл находится в домашнем каталоге:
назад к контейнеру.
Если вы используете Windows в качестве хоста, вы можете использовать помощью WinSCP для подключения к Docker и передачи файлов через GUI.
Если на Linux, то также будет работать через терминал.
это onliner для копирования одного файла при запуске контейнера tomcat.
Это позволит скопировать файл War в webapps и получить ваше приложение работает в кратчайшие сроки.
в случае, если кому-то вроде меня не ясно, что mycontainer в @h3nrik ответ означает, это фактически идентификатор контейнера. Чтобы скопировать файл WarpSquare.mp4 на /app/example_scenes/1440p60 вышел из контейнера Docker в текущую папку, я использовал это.
здесь 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/*. Я провел довольно много времени, почесывая голову, почему изменения здесь не сработали для меня. Надеюсь, это кому-то поможет.
Now I'm having a file called abc.txt in my host machine. How can I copy it to this container. Is there any step that I can add in Dockerfile which copy from Host to Container.
Читайте также: