【问题标题】:Jenkins always pull docker image from a declarative pipeline agent definitionJenkins 总是从声明性管道代理定义中提取 docker 映像
【发布时间】:2020-01-28 20:55:14
【问题描述】:

我有一个使用 agent {any} 定义的工作 Jenkins 管道。

但我想尝试在 docker 映像上运行测试。根据文档,我可以通过以下方式做到这一点:

pipeline {
     agent {
         docker { image 'centos/python-27-centos7:latest' }
     }
     stages {
        ...
     }
}

问题是我的 Jenkins 实例处于离线状态,使用此配置,它会在运行项目时尝试 docker pull 映像。

但是,我在 docker 中加载了 centos/python-27 图像(使用 docker images 可见,并且可以使用 docker run -i -t centos/python-27-centos7 /bin/bash 运行它

有什么方法可以在 Jenkins 中配置代理,使其不会尝试 pull Docker Hub 中的图像?

【问题讨论】:

    标签: docker jenkins jenkins-pipeline


    【解决方案1】:

    Docker 代理有一个alwaysPull 标志,您可以将其设置为falsetrue

    agent {
      docker {
        alwaysPull false
        image 'foo/bar'
      }
    }
    

    Jenkins 有一个流水线语法生成器可以在这些情况下提供帮助。在左侧的 Job 菜单中,有一个“Pipeline Syntax”图标。

    在那里你可以看到一些设置来帮助你生成你的管道指令。

    【讨论】:

      【解决方案2】:

      您可以尝试使用 dockerfile 代理。如果您构建映像所需的一切都是本地的,那么您就不必在线。

      pipeline {
       agent {
         dockerfile {
           filename "someOtherDockerfile"
           label "docker-nodes"
           args "-v /tmp:/tmp"
         }
       }
       stages {
          ...
       }
      

      您的另一个选择可能是设置一个私有 docker 注册表。 https://docs.docker.com/registry/deploying/

      【讨论】:

        【解决方案3】:

        您应该使用 siblings 而不是 嵌套 容器图像。即尝试通过-v /var/run/docker.sock:/var/run/docker.sock 将 docker daemon socket 的卷挂载到 Jenkins 容器。这样,您就可以访问主机系统上可用的图像。

        【讨论】:

        • 你可以挂载 docker socket 并且仍然使用 agent { docker { image 'centos/python-27-centos7:latest' args "-v /var/run/docker.sock:/var/run /docker.sock" } }
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多