这里是情况:
我有一个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。
答案 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
在那之后,一切都“正常”。非常痛苦的经历。