gpt4 book ai didi

Docker 中的 Docker - 第二层中的卷不工作 : Full of files in 1st level container, 为空

转载 作者:IT老高 更新时间:2023-10-28 21:41:12 28 4
gpt4 key购买 nike

我在 Docker 中运行 Docker(特别是运行 Jenkins,然后运行 ​​Docker 构建器容器来构建项目镜像,然后运行这些容器,然后运行测试容器)。

jenkins 镜像是这样构建和启动的:

docker build --tag bb/ci-jenkins .
mkdir $PWD/volumes/
docker run -d --network=host \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v $PWD/volumes/jenkins_home:/var/jenkins_home \
--name ci-jenkins bb/ci-jenkins

Jenkins 工作正常。但是有一个基于 Jenkinsfile 的作业,它运行这个:

docker run -i --rm -v /var/jenkins_home/workspace/forkMV_jenkins-VOLTRON-3057-KQXKVJNXOU4DGSUG3P27IR3QEDHJ6K7HPDEZYN7W6HCOTCH3QO3Q:/tmp/build collab/collab-services-api-mvn-builder:2a074614 mvn -B -T 2C install

这会导致错误:

The goal you specified requires a project to execute but there is no POM in this directory (/tmp/build).

当我对容器执行 docker exec -it sh 时,/tmp/build 为空。但是当我在 Jenkins 容器中时,路径 /var/jenkins_home/...QO3Q/ 存在,它包含所有已 checkout 并准备好的文件的工作区。

所以我想知道 - Docker 怎样才能愉快地挂载卷然后它是空的?*

更令人困惑的是,此设置适用于我在 Mac 上的同事。我在 Linux、Ubuntu 17.10、Docker 最新版本上。

最佳答案

经过一番研究,冷静下来思考,我意识到Docker-in-Docker并不是真的那么“-in-”,而是“Docker-next-to-Docker” ”。

使容器能够运行另一个容器的技巧是通过卷共享 /var/run/docker.sock:-v/var/run/docker.sock:/var/run/docker.sock

然后容器中的docker客户端实际调用宿主机上的Docker。

卷源路径(:左侧)不是指中间容器,而是指宿主文件系统!

意识到这一点后,修复方法是使宿主文件系统和 Jenkins(中间)容器中 Jenkins workspace 目录的路径相同:

docker run -d --network=host  \
...
-v /var/jenkins_home:/var/jenkins_home

瞧!有用。 (我创建了一个符号链接(symbolic link)而不是移动它,似乎也可以。)

如果您正在查看同事的 Mac,这会有点复杂,因为 Docker 的实现方式有些不同 - 它在基于 Alpine Linux 的 VM 中运行,但假装没有。 (不是 100% 确定这一点。)在 Windows 上,我读到路径有另一层抽象 - 从 C:/somewhere/... 映射到类似 Linux 的路径。

我希望我能节省一些时间来弄清楚:)

关于Docker 中的 Docker - 第二层中的卷不工作 : Full of files in 1st level container, 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49312100/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com