Jenkins不会等待docker exec命令完成

Jenkins不会等待docker exec命令完成,docker,jenkins,Docker,Jenkins,情况如下: 詹金斯,我有一个码头集装箱。我已经将插座安装到我的容器上,这样我就可以在jenkins容器内执行docker命令 volumes: - /var/run/docker.sock:/var/run/docker.sock 手动操作时,所有内容都在容器中工作。但是,当Jenkins执行作业时,它不会等待docker exec命令运行完成 下面是Jenkins文件的摘录。短期printenv命令正确运行,并打印环境变量。下一个命令python刚刚运行,然后Jenkins立即继续,而不

情况如下:

詹金斯,我有一个码头集装箱。我已经将插座安装到我的容器上,这样我就可以在jenkins容器内执行docker命令

volumes:
  - /var/run/docker.sock:/var/run/docker.sock
手动操作时,所有内容都在容器中工作。但是,当Jenkins执行作业时,它不会等待docker exec命令运行完成

下面是Jenkins文件的摘录。短期printenv命令正确运行,并打印环境变量。下一个命令python刚刚运行,然后Jenkins立即继续,而不是等待完成。Jenkins代理从正在Ubuntu映像上运行。在Jenkins之外运行所有这些命令都可以正常工作

echo "Running the app docker container in detached tty mode to keep it up"
docker run --detach --tty --name "${CONTAINER_NAME}" "${IMAGE_NAME}"

echo "Listing environment variables"
docker exec --interactive "${CONTAINER_NAME}" bash -c "printenv"

echo "Running test coverage"
docker exec --interactive "${CONTAINER_NAME}" bash -c "python -m coverage run --source . --branch -m pytest -vs"
这似乎与我的工作有关

请任何人解释一下如何让Jenkins等待docker exec命令完成,然后再继续下一步

我已经考虑过其他选择,比如Docker Pipeline插件,但在可能的情况下,我更倾向于使用类似于上面所述的东西


好的,另一种方法,我尝试过使用Docker管道插件。

Ugh。这取决于我在从属容器上设置docker支持的方式

我使用socat提供TCP服务器代理。相反,在主机和容器之间切换为普通的旧docker.sock卷

volumes:
  - /var/run/docker.sock:/var/run/docker.sock
第一次,我还必须通过在容器内执行以下操作来解决权限问题:

rm -Rf ~/.docker 
chmod 666 /var/run/docker.sock
在那之后,一切都正常了。非常痛苦的经历。

您可以使用docker.sock作为卷装载来协调主机上的容器,就像docker-compose.yml中的这样

根据您的设置,您可能需要运行

chmod 666 /var/run/docker.sock
首先要开始行动


这在macOS和Linux上都适用。

如果您想改为使用Jenkins管道的Docker绑定,这可以很容易地解决。@MattSchuchard-谢谢您的评论-您是指Docker管道插件吗?您是否有可能共享到有用参考页等的链接?是的,这将允许您确保容器中的命令在退出容器之前完成,因为它们将存在于块闭包中?不确定Groovy术语的范围。@MattSchuchard-更新了问题,并添加了一个关于docker管道插件可行性的新SOF问题的链接。如果你能看一看,有什么想法请分享。