docker - 无法在 Jenkins 上的不同容器上的卷之间共享数据
问题描述
我是 docker 的新手,我一直在努力解决以下问题:
sh "docker network create grid${buildProperties}"
sh "docker run -d --net grid${buildProperties} --health-cmd=\"curl -sSL http://selenium-hub${buildProperties}:4444/wd/hub/status | jq -r '.status' | grep 0\" --health-interval=5s --health-timeout=1s --health-retries=10 --name selenium-hub${buildProperties} selenium/hub:3.141.59-radium"
sh "docker run -d --link selenium-hub${buildProperties}:selenium-hub --net grid${buildProperties} -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm --name chrome-node${buildProperties} selenium/node-chrome:3.141.59-20200525"
sh "docker build -t ui-tests-runner ."
sh "docker run -d --link selenium-hub${buildProperties}:selenium-hub --net grid${buildProperties} -e HUB_HOST=http://selenium-hub:4444/wd/hub -v DataVolume5:/src --name ui-tests-runner${buildProperties} ui-tests-runner"
sh "docker ps"
sh "docker run --rm -v DataVolume5:/datavolume5 ubuntu ls -l datavolume5"
我正在尝试从ui-tests-runner${buildProperties}
容器/src
中获取数据,DataVolume5
当我列出datavolume5
但是,如果我尝试做同样的事情, 当我列出预期的内容时,chrome-node${buildProperties}
/home
我可以看到。/seluser
datavolume5
sh "docker network create grid${buildProperties}"
sh "docker run -d --net grid${buildProperties} --health-cmd=\"curl -sSL http://selenium-hub${buildProperties}:4444/wd/hub/status | jq -r '.status' | grep 0\" --health-interval=5s --health-timeout=1s --health-retries=10 --name selenium-hub${buildProperties} selenium/hub:3.141.59-radium"
sh "docker run -d --link selenium-hub${buildProperties}:selenium-hub --net grid${buildProperties} -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm -v DataVolume5:/seluser --name chrome-node${buildProperties} selenium/node-chrome:3.141.59-20200525"
sh "docker build -t ui-tests-runner ."
sh "docker run -d --link selenium-hub${buildProperties}:selenium-hub --net grid${buildProperties} -e HUB_HOST=http://selenium-hub:4444/wd/hub --name ui-tests-runner${buildProperties} ui-tests-runner"
sh "docker ps"
sh "docker run --rm -v DataVolume5:/datavolume5 ubuntu ls -l datavolume5"
我尝试了很多我在网上找到的东西,我检查了权限,这似乎很好。我唯一能想到的不同之处在于ui-tests-runner${buildProperties}
容器托管了一个存储库。我不知道还能尝试什么。我已经挣扎了几天了。
这段代码取自 Jenkinsfile 中的管道位
解决方案
您在这两个命令之间存在竞争条件:
sh "docker run -d ... -v DataVolume5:/src ... ui-tests-runner"
sh "docker run --rm -v DataVolume5:/datavolume5 ubuntu ls -l datavolume5"
第一个带有-d
选项的命令不会停止。它将在后台运行容器。然后,第二个命令会在您的 ui-tests-runner 容器启动时运行,并在您的测试运行之前显示该文件夹。
首次与该位置的图像内容一起使用时,也会填充命名卷。因此,当您在该位置使用包含图像内容的不同路径时,您将获得卷中的文件。
一旦该初始化步骤完成并且卷不再为空,您将只会看到由容器内的进程写入卷的文件。在重新部署图像时,您不会从图像文件系统中获得更改,因为容器中的路径被持久卷的内容替换。
推荐阅读
- gps - 如何计算从 GPS 坐标系到 SLAM 坐标系的旋转的旋转矩阵
- webpack - webpack + babel - 转换对象箭头函数不起作用
- java - 从另一个类更改变量值
- functional-programming - 有没有更好的方法来以无点的方式组合它?
- wordpress - 在 .htaccess 中使用环境变量来处理两个 RewriteBase 语句
- node.js - Mongoose 加入两个集合并获取两个属性中的引用数据
- flutter - flutter_test 是否支持测试“叶子”小部件?
- python - 使用多行属性解析 XML
- java - 使用本机查询更新数据库中数据的最佳方法是什么
- r - R中的顺序计算失败