Копирование данных из контейнеров Docker и в них

У меня есть 2 контейнера докеров, работающих в моей системе.

Я хотел скопировать данные из одного контейнера в другой контейнер из самой моей хост-системы.

я знаю, что для копирования данных из контейнера на хост мы должны использовать

docker cp <Source path> <container Id>:path in container

Теперь я пытаюсь скопировать данные напрямую из одного контейнера в другой, есть ли способ сделать это?

я пытался сделать это.

docker cp <container-1>:/usr/local/nginx/vishnu/vishtest.txt <container-2>:/home/smadmin/vishnusource/

но приведенная выше команда не удалась, заявив, что она не поддерживается.

я не должен копировать данные на свою локальную машину, это мое требование.

у кого-нибудь есть идея сделать это, спасибо заранее?


person Vishnu Ranganathan    schedule 22.05.2017    source источник
comment
Вы пробовали тома докеров?   -  person Robert    schedule 22.05.2017
comment
насколько я знаю, объем докера может быть обычным местом, которое может быть передано контейнерами с использованием источника монтирования и цели монтирования. Я действительно не имею никакого представления о томе докера, который мог бы помочь мне в этом сценарии. @ Роберт, пожалуйста, дайте мне предложение, как я могу использовать это здесь?   -  person Vishnu Ranganathan    schedule 22.05.2017
comment
Вы можете использовать netcat, если ваши контейнеры находятся в одной сети.   -  person user2915097    schedule 22.05.2017


Ответы (4)


Вы должны использовать volume для этого.

Сначала создайте том:

docker volume create --name shared

Затем запустите контейнеры следующим образом:

docker run -v shared:/shared-folder <container-1>
docker run -v shared:/shared-folder <container-2>

Таким образом, /shared-folder будет синхронизирован между этими двумя контейнерами.

Подробнее об этом читайте здесь

Надеюсь, поможет

person Jahongir Rahmonov    schedule 22.05.2017
comment
я создал том. когда я запускаю docker run -v shared:/shared-folder ‹container-1›, он говорит, что не может найти изображение «a75df1c6cfce: последний» локально, он пытается вытащить изображение. я хочу сделать это на работающем контейнере, что мне делать?? - person Vishnu Ranganathan; 22.05.2017

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

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

docker run --name container-1 -v vishnu-source:/usr/local/nginx/vishnu/ ...
docker run --name container-2 -v vishnu-source:/home/smadmin/vishnusource/ ...

Вы также можете злоупотреблять каналами и docker exec для перемещения файлов между ними, если оба контейнера включают tar (вы можете изменить . в первой команде на vishtest.txt, чтобы скопировать только один файл):

docker exec container-1 tar -cC /usr/local/nginx/vishnu . \
| docker exec -i container-2 tar -xC /home/smadmin/vishnusource/
person BMitch    schedule 22.05.2017

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

docker exec container-1 tar -c -f- folder/path/from/root | \
docker exec -i container-2 tar -x -f-
person Sahil Ahuja    schedule 02.01.2018

Использование труб также является простым решением.

Как root или внутри скрипта:

docker cp container-1:/data-path/. - | docker cp - container-2:/data-path

Как судоер:

sudo docker cp container-1:/data-path/. - | (sudo docker cp - container-2:/data-path)
person Stephan Becker    schedule 20.03.2020