如何配置 Jenkins 作业以使用 Docker 构建?

How to configure Jenkins job to build with Docker?

我正在尝试使用 Jenkins 和 'docker in the docker' 容器从 src 构建一个容器。

我在这里定义 Docker 云实例:

是否应该提供一个额外的选项卡,使作业能够使用上面的 Docker 云实例设置?

作业是一个多分支流水线:

但是当我尝试配置一个使用 docker 云实例的作业时,上面配置的 docker 构建选项不可用:

构建日志包含:

time="2021-04-04T14:27:16Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: no such file or directory" error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=vgpahcarinxfh05klhxyk02gg&shmsize=0&t=ron%2Fml-services&target=&ulimits=null&version=1: context canceled [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline [Bitbucket] Notifying commit build result [Bitbucket] Build result notified ERROR: script returned exit code 1 Finished: FAILURE

这表明构建正在与 Jenkins 相同的主机上搜索 Docker,但我试图在不同的主机上使用 Docker 进行构建?

我是否正确配置了 Jenkins Docker?

我的 Jenkinsfile 包含:

node {
      def app
      stage('Clone repository') {
            checkout scm
      }
      stage('Build image') {
            app = docker.build("ron/services")
       }
       stage('Push image') {
      docker.withRegistry('https://registry.hub.docker.com', 'git') {
       app.push("${env.BUILD_NUMBER}")
       app.push("latest")
              }
           }
        }

更新:

单击 Expose DOCKER_HOST 处的复选标记,重建包含错误:

+ docker build -t ron/services .
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
[Bitbucket] Notifying commit build result
[Bitbucket] Build result notified
ERROR: script returned exit code 1
Finished: FAILURE

docker cli 尝试使用 /var/run 中的 docker 套接字进行连接。这意味着没有配置外部守护进程,例如使用环境变量 DOCKER_HOST。 尝试单击 Expose DOCKER_HOST 处的复选标记。

不清楚这是否是您想要做的,但是配置 Docker 云会告诉您的 Jenkins 在 10.241.0.198(客户端)上启动一个容器,并且 运行 您的 jenkins 工作在那个容器里。要完成这项工作,需要检查几件事:

  1. 确保jenkins服务器上的jenkins用户可以访问客户端的2371端口,即'Test Connection'returns成功
  2. 如果要在容器中使用docker,请打开'Expose DOCKER_HOST'
  3. 配置 ssh 以便 jenkins 服务器上的 jenkins 用户可以在客户端 运行ning 时通过 ssh 连接到容器 (CMD ["/usr/sbin/sshd", "-D" ] 在 Docker 文件中)
  4. 在Docker代理模板中:配置一个标签;打开 'enabled';在容器中配置 docker 图像到 运行;设置远程文件系统根目录:/home/jenkins
  5. 在容器设置中:(非常重要!!)添加 /var/run/docker.sock:/var/run/docker.sock 到 Volumes

要使您的管道作业在 docker 图像上 运行,请将代理标签设置为您在第 4 步中提供的标签。

在容器中创建 运行 图像时的几个问题:

  1. 同时安装 openssh-clients 和 openssh-server
  2. 安装java
  3. 安装您可能需要的任何其他构建工具,例如 git
  4. 安装 docker 如果你想要 docker docker 支持
  5. 在 /etc/ssh/sshd_config 中配置 sftp,例如,添加
# override default of no subsystems
Subsystem       sftp    /usr/lib/openssh/sftp-server
Match group sftp
X11Forwarding no
AllowTCPForwarding no
ForceCommand internal-sftp