使用Docker Jenkins容器管道构建Docker映像时未找到Docker

使用Docker Jenkins容器管道构建Docker映像时未找到Docker,docker,jenkins,dockerfile,jenkins-pipeline,Docker,Jenkins,Dockerfile,Jenkins Pipeline,我有一个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/

我有一个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
以下是我如何运行我的詹金斯形象:

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是:
您缺少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

编辑:2018年5月

正如所指出的,这不鼓励使用这种技术:

此帖子的早期版本建议将挂载docker二进制文件从主机绑定到容器。这不再可靠,因为Docker引擎不再作为(几乎)静态库分发

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

$ docker exec -it -u root my-jenkins /bin/bash
# usermod -aG docker jenkins
最后重新启动my jenkins容器

原始答案:

您可以像在本博客中一样使用主机的
docker引擎


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

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

然后向下滚动至Docker安装并单击“添加Docker”。给它起个像“myDocker”这样的名字

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

在您的文件中,在运行任何docker命令之前添加以下阶段:

 stage('Initialize'){
        def dockerHome = tool 'myDocker'
        env.PATH = "${dockerHome}/bin:${env.PATH}"
    }
docker运行-d\
--组添加docker\
-v$(pwd)/詹金斯之家:/var/詹金斯之家\
-v/var/run/docker.sock:/var/run/docker.sock\
-v$(哪个码头工人):/usr/bin/docker\
-第8080:8080页-第50000:50000页\
詹金斯/詹金斯:lts

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

问题在于您的Jenkins,它无法使用docker引擎,即使您确实从插件管理器安装了docker。根据我的研究,有一些解决这个问题的方法:

1:使用一些docker映像构建一个映像,其中预装了docker,如getintodevops/jenkins with docker:lts提供的

2:从jenkins/jenkins构建映像,将卷装载到主机上,然后通过创建另一个具有相同卷的容器并执行bash cmd安装docker或使用建议,自行安装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路径,供jenkins容器使用:
-v$(哪个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
[来源]


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

添加docker路径,即
-v$(哪个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

我添加了上面的脚本并构建了dockerfile,它失败了,错误如下:curl:(23)写入正文失败(0!=16384)我现在可以运行该命令,只需在curl命令之前将用户更改为root即可。用户:是的。或者在重新定义用户的行之前添加命令。最好的卷映射是
-v/usr/local/bin:/user/bin
,否则将导致:
docker:Error-response-from-daemon:Mounts denied:EOF.
是否仍建议使用它?请参阅此注释:
此帖子的早期版本建议将docker二进制文件从主机绑定到容器。这不再可靠,因为Docker引擎不再作为(几乎)静态库分发。
。来源:@Guillaume Husta,你可能是对的,如果
Docker
使用系统库,它可能不安全。然而,我在jenkins
debian
图像中使用了来自
coreos
主机的绑定,从1年前开始,我在30多个docker图像中使用了该绑定。。。在
docker构建过程中未发现任何冲突或问题。好的,谢谢您的反馈。正如您所说,这将取决于上下文。我认为最初的答案仍然有效,因为使用卷装载公开主机的docker二进制文件的方法正是Red Hat的Openshift容器平台v3.11(LTS)在docker构建策略下所做的(您可以清楚地看到服务帐户创建的卷装载中列出了
/var/run/docker.sock
),因此我希望这可以减轻一些关于稳定性的担忧;)这种方法是否需要额外的配置?我做了同样的事情,并且能够运行简单的命令,如
docker-v
,但是当涉及到
docker build
时,我发现
无法在unix:///var/run/docker.sock. docker守护进程正在运行吗?
。。。有什么建议吗?@ChernikovP我也有同样的错误。您能解决吗?使用上述方法获取此错误
docker:error-response-from-daemon:找不到组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