如何在Jenkins Pipeline作业中运行Docker命令

7
在我的“管理Jenkins”>“全局工具配置”中,我已经配置了一个名为“docker”的工具,如下所示:
name:                   docker
install automatically:  CHECKED
docker version:         latest

然后我在我的jenkinsfile文件中只有以下内容,没有其他内容:
node {
    DOCKER_HOME = tool "docker"
    sh """
        echo $DOCKER_HOME
        ls $DOCKER_HOME/bin/
        $DOCKER_HOME/bin/docker images
        $DOCKER_HOME/bin/docker ps -a
    """
}

我收到了这样的错误信息:“无法连接到Docker守护进程。此主机上运行着Docker守护进程吗?”。
以下是完整的控制台日志:
Started by user Syed Rakib Al Hasan
[Pipeline] node
Running on master in /var/jenkins_home/workspace/helloDocker
[Pipeline] {
[Pipeline] tool
[Pipeline] sh
[helloDocker] Running shell script
+ echo /var/jenkins_home/tools/org.jenkinsci.plugins.docker.commons.tools.DockerTool/docker
/var/jenkins_home/tools/org.jenkinsci.plugins.docker.commons.tools.DockerTool/docker
+ ls /var/jenkins_home/tools/org.jenkinsci.plugins.docker.commons.tools.DockerTool/docker/bin/
docker
+ /var/jenkins_home/tools/org.jenkinsci.plugins.docker.commons.tools.DockerTool/docker/bin/docker images
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE

如何确保Docker守护程序/服务在管道到达运行Docker命令的行之前已经运行/启动?是否有其他本地的Docker构建步骤插件可以实现我在这里所做的事情?例如docker ps -a或docker images或docker build -t?一些假设:假设我的选择节点尚未在主机上安装/运行Docker / Docker-engine。这就是工具命令的目的,如果节点上没有安装,则自动安装Docker。

你不仅需要安装Docker,还需要确保Docker守护进程正在运行。你可以通过其他方式配置你的主机,例如使用ansible、systemd-unit文件、AMIs等,以适应你的领域。或者你可以将确保Docker服务正常运行作为你的流水线中的第一步(阻塞式)。 - ffledgling
我的jenkins本身位于docker容器内 - 官方的jenkins docker容器。在容器内运行sudo service docker start无法生效,所以我没有这个选项。 - Rakib
2
如果你的Jenkins在Docker容器中,那么它仍然不能自动运行Docker命令,它需要访问正在运行的Docker守护程序。无论你在哪里运行命令,都没有Docker守护程序在运行。你可以通过转发守护程序套接字将主机Docker守护程序暴露在Docker容器内,或者在容器内安装守护程序并使用它。这取决于你的设置。请花些时间了解Docker的工作原理。 - ffledgling
我认为最干净的方法是使用Docker配置一个额外的主机,并将其添加为Jenkins的从节点。那些Docker-in-Docker的方法相当不可靠...这样,您仍然可以将Jenkins主节点作为容器运行,并使用从节点进行Docker构建。 - fishi0x01
@ffledgling,你是在指svendowideit在这个页面中提到的方法吗:https://forums.docker.com/t/using-docker-in-a-dockerized-jenkins-container/322/3? - Rakib
这让我想起了我在使用VirtualBox时做过的一件事。我需要使用Windows来构建某个东西,并且需要对构建环境进行严格控制。所以我只是克隆了一个已经仔细构建了环境的Windows虚拟机,然后让Jenkins启动它并指示其构建该项目,然后将构建产品复制到主机上。 - Omnifarious
1个回答

2
这个 Jenkins 插件是为 Docker 客户端设计的;我会通过以下方式解决(绕过):
  • 设置 Jenkins 从机,使 Docker 守护进程可达,并添加标签
  • 设置一个清理任务,如果 Docker 守护进程不可达,则任务失败(这样我们可以通知基础设施团队,而不必让 QA 找出并升级问题)
  • 将假定 Docker 守护进程可达的任务分配给此标签
希望这有所帮助,我很好奇是否有更好的解决方案!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接