7

我在 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"

问题是,我需要做什么才能使用 Container 1 路径而不是主机?或者我在这里误解了关于 docker 的一些东西?

4

2 回答 2

7

对于你所说的“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, docker cp,Docker rm序列。这是非常手动的,但它的优势是 a 的“本地”端docker cp始终是当前文件系统上下文,即使您是从容器内与主机的 Docker 守护进程通信。

于 2018-11-29T15:10:14.190 回答
0

容器 2 是否绑定主机路径无关紧要,因为容器 1 中文件的更改直接影响主机路径上的所有内容。所以他们都在同一个文件上工作。

因此,您的设置是正确的,并且将与您描述的方式引用它们相同。

更新
如果您想确保该过程不会修改主机文件,您可以执行以下操作:

构建一个自定义 docker 图像,它将所有数据从一个文件夹复制a到另一个文件夹b,您可以在其中执行文件夹上的脚本b。然后用./:/a. 通过这种方式,您可以在绑定到容器的文件上保持灵活性,而无需让容器修改主机文件。

我希望这回答了你的问题 :)

于 2018-11-29T13:13:41.020 回答