首页 > 解决方案 > 无法在 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我可以看到。/seluserdatavolume5

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 中的管道位

标签: dockerseleniumjenkins

解决方案


您在这两个命令之间存在竞争条件:

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 容器启动时运行,并在您的测试运行之前显示该文件夹。

首次与该位置的图像内容一起使用时,也会填充命名卷。因此,当您在该位置使用包含图像内容的不同路径时,您将获得卷中的文件。

一旦该初始化步骤完成并且卷不再为空,您将只会看到由容器内的进程写入卷的文件。在重新部署图像时,您不会从图像文件系统中获得更改,因为容器中的路径被持久卷的内容替换。


推荐阅读