詹金斯不等待docker exec命令完成

时间:2020-02-18 16:59:17

标签: docker jenkins

这里是情况:

我有一个docker容器(詹金斯)。我已经将套接字安装到容器中,以便可以在jenkins容器中执行docker命令。

手动,一切都在容器中进行。但是,当詹金斯执行作业时,docker exec命令不会“等待”运行到完成。

下面是Jenkinsfile的摘录。短暂的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"

似乎与this question有关。

请任何人解释如何让詹金斯(Jenkins)等待docker exec命令完成之后再继续下一步。

曾经考虑过替代方案,例如Docker Pipeline插件,但在可能的情况下,我更愿意使用与我上面相似的方法。

好,另一种方法,我尝试使用Docker Pipeline插件here

2 个答案:

答案 0 :(得分:1)

您可以使用docker.sock进行卷挂载,以在docker-compose.yml中像这样在主机上编排容器

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

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

chmod 666 /var/run/docker.sock

从头开始。

这在macOS和Linux上均可使用。

答案 1 :(得分:0)

U。这取决于我要在从属容器上设置Docker支持的方式。

我曾经使用socat提供一个TCP服务器代理。取而代之的是,将其切换为主机和容器之间的普通docker.sock卷。

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

第一次,我还必须通过这样做(在容器内部)解决权限问题:

rm -Rf ~/.docker 
chmod 666 /var/run/docker.sock

在那之后,一切都“正常”。非常痛苦的经历。