我有一个 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
您缺少 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
在 Jenkins 界面中,转到 “管理 Jenkins/全局工具配置”
然后向下滚动到 Docker Installations 并单击 “Add Docker”。给它起一个名字,比如 “myDocker”
确保选中“自动安装”框。单击 “添加安装程序” 并选择 “从 docker.com 下载”。在 Docker 版本中保留“最新”。确保单击“保存”。
在运行任何 docker 命令之前,在 Jenkinsfile 中添加以下阶段:
stage('Initialize'){
def dockerHome = tool 'myDocker'
env.PATH = "${dockerHome}/bin:${env.PATH}"
}
正如
Guillaume Husta所指出的,这篇 jpetazzo 的博客文章 不鼓励这种技术:
本文的前版本建议将 docker 二进制文件从主机传输到容器。这不再可靠,因为 Docker 引擎不再作为(几乎)静态库分发。
Docker 客户端应安装在容器内,如此处所述。另外,
bind-mount
用户应该在jenkins
组中,因此执行以下操作:
docker
最后重新启动
$ docker exec -it -u root my-jenkins /bin/bash
# usermod -aG docker jenkins
容器。
原答案:
您可以使用主持人的my-jenkins
,就像在这个
博客
文章中一样。
docker engine
这避免了主机和 jenkins 容器上有多个 docker 引擎版本。
问题出在你的 Jenkins 中,即使你从插件管理器安装了 docker,它也无法使用 docker 引擎。根据我的研究,有一些替代方案可以解决这个问题:
使用一些 docker 镜像构建一个镜像,其中预装了 docker,如
getintodevops/jenkins-withdocker:lts提供的 2:从jenkins/jenkins构建图像,将卷安装到主机,然后通过创建另一个具有相同卷的容器并执行bash cmd来安装docker或使用
Robert建议自行安装docker
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路径以供jenkins容器使用:
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
你的 docker 命令应该如下所示:
-v $(which docker):/usr/bin/docker
[来源]
https://forums.docker.com/t/docker-not-found-in-jenkins-pipeline/31683额外选项:如果您只想使用单个 Jenkis 服务器,则毫无意义,但始终可以使用映像安装 Ubuntu 等操作系统并从那里安装 jenkins .war 文件
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
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
本节帮助我在 jenkins 容器内安装 docker:https://www.jenkins.io/doc/book/installing/docker/#downloading-and-running-jenkins-in-docker
-v $(which docker):/usr/bin/docker
我也有同样的问题。在我的 Jenkins 服务器中找不到 Docker。因此,为了解决这个问题,我们需要安装 docker 和 Jenkins Image。
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
:
1.Create one docker file named as "DockerfileJenkins"
2. Create docker-compose file for Jenkins Server.
3. Run the docker-compose file.
:
FROM jenkins/jenkins
USER root
# see https://docs.docker.com/compose/install/
RUN curl -L \
"https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose
RUN curl -fsSL https://get.docker.com | sh
USER jenkins
如果您使用 docker-compose 文件来启动 Jenkins,您应该将
version: '2'
services:
jenkins:
build:
context: .
dockerfile: DockerfileJenkins
hostname: jenkins
container_name: jenkins
restart: always
privileged: true
user: root
ports:
- 8083:8080
- 50003:50000
volumes:
- ~/jenkins_data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
示例:
- /usr/bin/docker:/usr/bin/docker