Несмотря на то, что вы говорите «Docker-in-Docker» и «dind», эта настройка на самом деле не Docker-in-Docker: ваш контейнер1 дает инструкции демону Docker хоста, который влияет на container2.
Host Container1
/-----
(Docker)
| Container2
\---->
(Примечание: это - , как правило, рекомендуемый путь для установок типа CI. «Docker-in-Docker» обычно означает, что container1 запускает свой собственный, отдельный демон Docker, который обычно небыть рекомендованным.)
Поскольку container1 дает инструкции Docker хоста, а Docker хоста запускает container2, любые пути docker run -v
всегда являются путями хоста.Если вы не знаете, что какой-то конкретный каталог уже смонтирован в вашем контейнере, сложно обмениваться файлами с «субконтейнерами».
Один из способов обойти это - утверждать, что существует общий путь для некоторыхsort:
docker run \
-v $PWD/exchange:/exchange \
-v /var/run/docker.sock:/var/run/docker.sock \
-e EXCHANGE_PATH=$PWD/exchange \
--name container1
...
# from within container1
mkdir $EXCHANGE_PATH/container2
echo hello world > $EXCHANGE_PATH/container2/file.txt
docker run \
-v $EXCHANGE_PATH/container2:/data
--name container2
...
Когда я делал это в прошлом (для тестовой установки, которая хотела запускать вспомогательные контейнеры), я использовал кропотливые docker create
, docker cp
, docker start
,docker cp
, Docker rm
последовательность.Это чрезвычайно ручное решение, но оно имеет то преимущество, что «локальная» сторона docker cp
всегда является текущим контекстом файловой системы, даже если вы разговариваете с демоном Docker хоста из контейнера.