【发布时间】:2018-03-24 16:59:30
【问题描述】:
我正在开发一个应用程序,我希望使用 Jenkins 进行持续集成,此外我希望能够控制 CI 环境。我正在 OS X 上进行本地开发,并且正在推送到远程 Ubuntu 16.04 VM。 所有这些都将我引向了 Docker。 基本上我想要的是 Jenkins-in-Docker,但也需要 Docker-in-Jenkins。我的 build slave(s) 最初将仅限于 master。
现在,过去几天我一直在阅读一些关于 Docker 的帖子,但我仍然不能完全确定我是否深入了解它。因此提出了这个问题。
目前,这是我的设置:
詹金斯:
/docker-compose.yml
version: '3'
services:
jenkins:
build: ./jenkins
volumes:
- /var/run/docker.sock:/var/run/docker.sock # allowing docker-in-docker
- ./jenkins_home:/var/jenkins_home
ports:
- 8080:8080
/jenkins/Dockerfile
FROM docker:17.12 AS docker
FROM jenkins/jenkins:lts
COPY --from=docker /usr/local/bin/docker /usr/local/bin/docker
上面的设置工作得很好——直到我使用 Docker-in-Jenkins。 Jenkins 已安装完毕,但是当我构建任何将 使用 Docker 的作业时,我收到一个错误,即
在尝试连接到 Docker 守护程序时获得权限被拒绝 unix:///var/run/docker.sock 处的套接字:发布 (...) 拨号 unix /var/run/docker.sock: 连接:权限被拒绝
CI 来源:
/Jenkinsfile
pipeline {
agent { dockerfile true }
stages {
stage('Initial') {
steps {
println 'Hello world!'
}
}
}
}
/Dockerfile
FROM python:3.6-slim-jessie
COPY requirements.txt ./
RUN pip install -r requirements.txt --no-cache-dir
CMD ["python"]
现在回答问题!
首先,显然我缺少一些允许容器使用我的主机 Docker 守护程序的权限。我看到this post(以及其他人)对此有一些答案。
其次,这甚至是预期的设置方式吗?我想以正确的方式学习 docker,我不知道我是否遗漏了一些关于例如多阶段构建?
【问题讨论】:
-
Jenkins 插件和执行对事物的设置方式进行了假设,这使得尝试使用现有插件进行这样的设置变得困难。几种可能加快速度的方法(1)查看执行的 Jenkins
docker命令。 Jenkins 正在控制 Docker 执行你可能会对你的发现感到惊讶 (2) 尝试绘制每个容器的容器、卷挂载、用户和组的图片(我以前做过,发现它对个人很有帮助)(3)先在本地搞清楚。首先在 Jenkins 上学习这就是我所说的“艰难的方式”。 -
所以,对于
Got permission denied- 我的第一个猜测是,即使 Docker 客户端可以与套接字通信,它也没有正确的用户/组可以使用。如果您尝试将root拥有的文件安装到您的工作区并尝试读取它,您可能会看到类似的错误。我建议在代理上运行stat -c %g /var/run/docker.sock以查看 Docker 套接字的所属组是什么,然后添加args '--group-add=that-group-id'(来自 docs),看看这是否能让你更进一步。 -
你是否阅读过Docker推荐的博客文章:jpetazzo.github.io/2015/09/03/…?请注意最后关于在最新版本的 Docker 中复制 Docker 二进制可执行文件的警告。您可能应该从 Jenkins Dockerfile 的最后一行中删除它。
标签: docker jenkins dockerfile jenkins-pipeline