无法在Jenkins上不同容器上的卷之间共享数据

时间:2020-06-11 09:22:52

标签: docker selenium 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}容器中的数据从/srcDataVolume5中 列出datavolume5

的内容时,我得到0个文件

但是,如果我尝试使用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中的管道位

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:0)

我假设您使用以下命令将DataVolume5创建为命名卷 docker volume create
在这种情况下,您无需指定绝对路径,但是docker volume inspect DataVolume5将为您提供路径。

请尝试使用特定的主机目录作为共享卷。

docker run -d -v myVolume:/src ui-tests-runner

答案 2 :(得分:-1)

  1. 运行ui-tests-runner命令后,首先检查 DataVolume5 是否包含某些内容
  2. 在命令docker中运行--rm -v DataVolume5 :/ datavolume5 ubuntu ls -l datavolume5 给出 DataVolume5
  3. 的绝对路径

例如。 docker运行--rm -v / abs-path-to-directory / DataVolume5 :/ datavolume5 ubuntu ls -l datavolume5