我在docker中安装了docker,并尝试安装文件夹。
比方说,我有希望与他的父母共享的文件夹。在主机上,我在/ tmp / dind中创建了一个名为foo
的文件。主机启动容器1,该容器启动容器2。这是我想要的结果。
Host | Container 1 | Container 2
/tmp/dind | /tmp/dind2 | /tmp/dind3
<-------> <------->
相反,我明白了
Host | Container 1 | Container 2
/tmp/dind | /tmp/dind2 | /tmp/dind3
<------->
<----------------------->
此处的代码:
docker run --rm -it \
-v /tmp/dind:/tmp/dind2 \
-v /var/run/docker.sock:/var/run/docker.sock docker sh -c \
"docker run --rm -it \
-v /tmp/dind2:/tmp/dind3 \
-v /var/run/docker.sock:/var/run/docker.sock \
docker ls /tmp/dind3"
这什么也不输出,而下一条命令给出foo作为结果。我更改了挂载的音量:
docker run --rm -it \
-v /tmp/dind:/tmp/dind2 \
-v /var/run/docker.sock:/var/run/docker.sock docker sh -c \
"docker run --rm -it \
-v /tmp/dind:/tmp/dind3 \
-v /var/run/docker.sock:/var/run/docker.sock \
docker ls /tmp/dind3"
问题是,为了使用容器1路径而不是主机,我需要做什么?还是我在这里误解了一些关于Docker的信息?
答案 0 :(得分:1)
对于您所说的“ Docker-in-Docker”和“ dind”而言,此设置实际上并不是Docker-in-Docker:您的container1正在向影响容器Container2的主机Docker守护进程提供指令。
Host Container1
/-----
(Docker)
| Container2
\---->
(注意:通常,此是)是CI类型设置的推荐路径。“ Docker-in-Docker”通常意味着container1正在运行自己的单独的Docker守护程序,而该守护进程通常不是推荐。)
由于container1正在向主机的Docker提供指令,并且主机的Docker正在启动container2,所以任何docker run -v
路径始终是主机的路径。除非您知道某些特定目录已经安装到您的容器中,否则很难与“子容器”共享文件。
一种解决此问题的方法是断言存在某种共享路径:
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
,{{ 1}},docker cp
序列。这是非常手动的操作,但是它的优点是,即使您正在从容器内部与主机的Docker守护程序进行通信,Docker rm
的“本地”端也始终是当前文件系统上下文。
答案 1 :(得分:0)
容器2是否绑定主机路径无关紧要,因为容器1中文件的更改直接影响主机路径上的所有内容。因此它们都在同一文件上工作。
因此您的设置是正确的,并且将起到与您描述的方式引用相同的作用。
更新
如果要确保该过程不修改主机文件,可以执行以下操作:
构建一个自定义docker映像,该映像将所有数据从文件夹a
复制到文件夹b
,在其中执行文件夹b
上的脚本。然后使用./:/a
挂载文件。这样,您可以灵活地选择将哪些文件绑定到容器,而无需让容器修改主机文件。
我希望这能回答您的问题:)