【问题标题】:How to configure Jenkins job to build with Docker?如何配置 Jenkins 作业以使用 Docker 构建?
【发布时间】:2026-02-09 06:45:01
【问题描述】:

我正在尝试使用 Jenkins 和“docker in the docker”容器构建一个分支,以从 src 构建一个容器。

我在这里定义 Docker 云实例:

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

作业是多分支管道:

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

构建日志包含:

time="2021-04-04T14:27:16Z" level=error msg="failed to dial gRPC: 无法连接到 Docker 守护进程。 'docker daemon' 是否正在运行 这个主机?:拨打 unix /var/run/docker.sock:连接:没有这样的文件或 连接期间的目录“错误:发布 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: 上下文取消 [Pipeline] } [Pipeline] // 阶段 [Pipeline] } [Pipeline] // 节点 [Pipeline] 管道结束 [Bitbucket] 通知 提交构建结果 [Bitbucket] 构建结果通知错误:脚本 返回退出代码 1 完成:失败

这表明构建正在与 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 jenkins kubernetes jenkins-pipeline digital-ocean


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我尝试在导出 DOCKER_HOST 处单击复选标记,但类似的错误,我已更新问题。
    • 您似乎没有使用 docker 生成构建代理,而只是想使用 docker 守护进程进行构建。在这种情况下,您可以手动设置环境变量。
    【解决方案2】:

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

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

    要让您的管道作业在 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
    

    【讨论】:

      最近更新 更多