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

时间:2017-06-30 15:56:44

标签: docker jenkins 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

以下是我运行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

6 个答案:

答案 0 :(得分:13)

你错过了泊坞客户端。在Dockerfile中安装它:

>>> import re
>>> my_string = "        Name         Last_Name              Place"
>>> my_string_another = "Aman         Raparia                India"
>>> re.search('(\S+)\s+(\S*)\s+(\S+)',my_string).groups()
('Name', 'Last_Name', 'Place')
>>> re.search('(\S+)\s+(\S*)\s+(\S+)',my_string_another).groups()
('Aman', 'Raparia', 'India')
>>> my_string_another = "Aman                             India"
>>> re.search('(\S+)\s+(\S*)\s+(\S+)',my_string_another).groups()
('Aman', '', 'India')

Source

答案 1 :(得分:7)

编辑:2018年5月

正如Guillaume Husta指出的那样,jpetazzo's blog article阻止了这种技术:

  

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

Docker客户端应该按照here所述安装在容器中。此外,jenkins用户应位于docker组中,因此请执行以下操作:

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

最后重新启动my-jenkins容器。

原始回答:

您可以在此@Adrian Mouat博客article中使用主持人的docker engine

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

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

答案 2 :(得分:3)

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

然后向下滚动至Docker Installations,然后单击“添加Docker” 。给它起一个像“ myDocker”

的名字

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

enter image description here

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

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

答案 3 :(得分:1)

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

1 :使用一些带有预安装docker的docker映像构建映像,如 getintodevops / jenkins-withdocker:lts

提供的那样

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

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 $(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这样的OS并从那里安装jenkins .war文件。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

将 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