【问题标题】:Docker not found when building docker image using Docker Jenkins container pipeline使用 Docker Jenkins 容器管道构建 Docker 映像时未找到 Docker
【发布时间】:2021-09-02 14:01:42
【问题描述】:

我有一个 Jenkins 作为 docker 容器运行,现在我想使用管道构建一个 Docker 映像,但 Jenkins 容器总是告诉 Docker not found。

[simple-tdd-pipeline] Running shell script
+ docker build -t simple-tdd .
/var/jenkins_home/workspace/simple-tdd-pipeline@tmp/durable-
ebc35179/script.sh: 2: /var/jenkins_home/workspace/simple-tdd-
pipeline@tmp/durable-ebc35179/script.sh: docker: not found

这是我运行 Jenkins 映像的方式:

docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v 
/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock 
jenkins

Jenkins 镜像的 DockerFile 是: https://github.com/jenkinsci/docker/blob/9f29488b77c2005bbbc5c936d47e697689f8ef6e/Dockerfile

【问题讨论】:

    标签: docker jenkins dockerfile jenkins-pipeline


    【解决方案1】:

    您缺少 docker 客户端。在 Dockerfile 中安装它:

    RUN curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz 
      && tar xzvf docker-17.04.0-ce.tgz 
      && mv docker/docker /usr/local/bin 
      && rm -r docker docker-17.04.0-ce.tgz
    

    Source

    【讨论】:

    • 我添加了上面的脚本并构建了 dockerfile,它失败并出现以下错误: curl: (23) Failed writing body (0 != 16384)
    • 我现在可以运行该命令,只需在 curl 命令之前将用户更改为 root。用户根
    • 是的。或者在重新定义用户的行之前添加命令
    【解决方案2】:

    在您的 Jenkins 界面中转到“管理 Jenkins/全局工具配置”

    然后向下滚动到 Docker Installations 并单击“添加码头工人”.给它起一个名字“我的码头工人”

    确保选中上面写着的框“自动安装”.点击“添加安装程序”并选择“从 docker.com 下载”.在 Docker 版本中保留“最新”。确保单击“保存”。

    在运行任何 docker 命令之前,在 Jenkinsfile 中添加以下阶段:

     stage('Initialize'){
            def dockerHome = tool 'myDocker'
            env.PATH = "${dockerHome}/bin:${env.PATH}"
        }
    

    【讨论】:

    • 这种方法是否需要额外的配置?我做了同样的事情并且能够像docker -v一样运行简单的命令,但是当谈到docker build时,我得到了Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?...有什么建议吗?
    • @ChernikovP 我遇到了同样的错误。你能解决吗?
    • @ChernikovP,@khushboo29 你需要将jenkins 添加到docker 组,这样:sudo usermod -a -G docker jenkins
    【解决方案3】:

    编辑:2018 年 5 月

    正如Guillaume Husta 所指出的,jpetazzo's blog article 不鼓励这种技术:

    这篇文章的早期版本建议 bind-mount 将 docker 二进制文件从主机传输到容器。这不再可靠,因为 Docker 引擎不再作为(几乎)静态库分发。

    Docker 客户端应安装在容器内,如here 所述。另外,jenkins 用户应该在docker 组中,所以执行以下操作:

    $ docker exec -it -u root my-jenkins /bin/bash
    # usermod -aG docker jenkins
    

    最后重启my-jenkins 容器。

    原答案:

    您可以使用主机的docker engine 就像在这个@Adrian Mouat 博客article 中一样。

     docker run -d 
       --name my-jenkins 
       -v /var/jenkins_home:~/.jenkins 
       -v /var/run/docker.sock:/var/run/docker.sock 
       -p 8080:8080 jenkins
    

    这避免了在主机和詹金斯容器上有多个 docker 引擎版本。

    【讨论】:

    • 最好的卷映射是-v /usr/local/bin:/user/bin,否则会导致:docker: Error response from daemon: Mounts denied: EOF.
    • 还推荐吗?请参阅此说明:Former versions of this post advised to bind-mount the docker binary from the host to the container. This is not reliable anymore, because the Docker Engine is no longer distributed as (almost) static libraries.。来源:jpetazzo.github.io/2015/09/03/…
    • @Guillaume Husta,你可能是对的,如果 Docker 使用系统库,它可能不安全。但是,我在 jenkins debian 图像中使用来自 coreos 主机的此绑定,因为 1 年现在在 30 多个 docker 图像中......在 docker build 进程中没有看到任何冲突或麻烦。
    • 好的,谢谢您的反馈。正如你所说,这将取决于上下文。
    • 我认为最初的答案仍然有效,因为这种使用卷挂载公开主机的 docker 二进制文件的方式正是 Red Hat 的 Openshift Container Platform v3.11 (LTS) 在 Docker Build 策略下所做的(你可以清楚地看到 /var/run/docker.sock 列出在由服务帐户创建的 Volume Mounts 中),所以我希望这能减轻一些关于稳定性的担忧;)
    【解决方案4】:

    问题出在您的 Jenkins 中,即使您确实从插件管理器安装了 docker,它也无法使用 docker 引擎。根据我的研究,有一些替代方法可以解决此问题:

    1:使用一些带有预安装 docker 的 docker 镜像构建一个镜像,就像提供的一样getintodevops/jenkins-withdocker:lts

    2:从 jenkins/jenkins 构建映像,将卷安装到您的主机,然后通过创建另一个具有相同卷的容器并执行 bash cmd 来安装 docker 或使用 Robert 建议自行安装 docker

    docker run -p 8080:8080 -p 50000:50000 -v $HOME/.jenkins/:/var/jenkins_home 
    -v /var/run/docker.sock:/var/run/docker.sock jenkins/jenkins:latest
    

    或 3:最简单的,只需从您的主机添加已安装的 docker 路径以供您的詹金斯容器使用:-v $(which docker):/usr/bin/docker

    您的 docker 命令应如下所示:

    docker run 
    --name jenkins --rm 
    -u root -p 8080:8080 -p 50000:50000 
    -v $(which docker):/usr/bin/docker
    -v $HOME/.jenkins/:/var/jenkins_home 
    -v /var/run/docker.sock:/var/run/docker.sock 
    jenkins/jenkins:latest
    

    [来源]https://forums.docker.com/t/docker-not-found-in-jenkins-pipeline/31683

    额外选项:如果您只想使用单个 Jenkis 服务器,则没有任何意义,但始终可以使用映像安装像 Ubuntu 这样的操作系统并从那里安装 jenkins .war 文件

    【讨论】:

      【解决方案5】:
      docker run -d 
      --group-add docker 
      -v $(pwd)/jenkins_home:/var/jenkins_home 
      -v /var/run/docker.sock:/var/run/docker.sock 
      -v $(which docker):/usr/bin/docker 
      -p 8080:8080 -p 50000:50000 
      jenkins/jenkins:lts
      

      只需在 docker 运行时添加选项--group-add docker

      【讨论】:

      • 使用上述方法时出现此错误docker: Error response from daemon: Unable to find group docker.
      【解决方案6】:

      将 docker 路径(即-v $(which docker):/usr/bin/docker)添加到容器中,例如

       docker run -d 
         --name my-jenkins 
         -v $(which docker):/usr/bin/docker 
         -v /var/jenkins_home:~/.jenkins 
         -v /var/run/docker.sock:/var/run/docker.sock 
         -p 8080:8080 jenkins
      

      【讨论】:

        【解决方案7】:

        本节帮助我在 jenkins 容器中安装 docker:https://www.jenkins.io/doc/book/installing/docker/#downloading-and-running-jenkins-in-docker

        此外,我必须将步骤 4(a) 中 Dockerfile 中的 FROM jenkins/jenkins:2.303.1-lts-jdk11 替换为 jenkins/jenkins

        【讨论】:

          猜你喜欢
          • 2018-03-27
          • 1970-01-01
          • 1970-01-01
          • 2019-11-15
          • 1970-01-01
          • 2020-09-10
          • 2017-07-16
          • 2017-12-20
          • 2018-06-15
          相关资源
          最近更新 更多