使用Docker Jenkins容器管道构建docker镜像时找不到Docker

kit*_*112 17 jenkins docker dockerfile jenkins-pipeline

我有一个Jenkins作为docker容器运行,现在我想使用管道构建一个Docker镜像,但Jenkins容器总是告诉Docker找不到.

[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
Run Code Online (Sandbox Code Playgroud)

以下是我运行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
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*ert 15

你错过了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
Run Code Online (Sandbox Code Playgroud)

资源


Fra*_*rel 8

编辑:2018年5月

正如Guillaume Husta所指出的,这篇jpetazzo的博客文章不鼓励这种技巧:

此帖子bind-mount的旧版本建议从主机到容器的docker二进制文件.这不再可靠,因为Docker Engine不再作为(几乎)静态库分发.

码头工人客户应在容器内安装的描述在这里.此外,jenkins用户应该在docker组中,因此执行以下操作:

$ docker exec -it -u root my-jenkins /bin/bash
# usermod -aG docker jenkins
Run Code Online (Sandbox Code Playgroud)

最后重启my-jenkins容器.

原始答案:

您可以docker engine@Adrian Mouat博客文章中使用主机.

 docker run -d \
   --name my-jenkins \
   -v /var/jenkins_home:~/.jenkins \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -p 8080:8080 jenkins
Run Code Online (Sandbox Code Playgroud)

这避免了在主机和jenkins容器上有多个docker引擎版本.


bsi*_*a89 7

问题在于您的 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
Run Code Online (Sandbox Code Playgroud)

或 3:最简单的方法,只需从主机添加已安装的 docker 路径,以供 jenkins 容器使用:-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
Run Code Online (Sandbox Code Playgroud)

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

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


Har*_*rry 6

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

然后向下滚动到Docker Installations并单击“添加Docker”。给它起一个像“ myDocker”的名字

确保选中“自动安装”框。单击“添加安装程序”,然后选择“从docker.com下载”。在Docker版本中保留“最新”。确保单击“保存”。

在此处输入图片说明

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

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