在 jenkins slave 的容器内访问 docker

Access docker within container on jenkins slave

我的问题基本上是Access Docker socket within container and Accessing docker host from (jenkins) docker container

的组合

我的目标

至 运行 Jenkins 完全 docker 化,包括动态从站并能够在从站内创建 docker 容器。

如果 Unix-docker-sock 正确暴露给 Jenkins master,那么除了最后一部分,一切都已经正常工作了https://github.com/maxfields2000/dockerjenkins_tutorial

问题

与动态配置的从站不同,主站是通过 docker-compose 启动的,因此可以正确访问 UNIX 套接字。

对于动态生成的slave,这种方法是行不通的。 我试图将访问权限转发到 docker 就像

VOLUME /var/run/docker.sock
VOLUME /var/lib/docker

在构建图像的过程中。不幸的是,到目前为止,当我尝试访问从站中的 docker.sock 时,我得到了一个 Permission denied (socket: /run/docker.sock),它的创建方式如下:https://gist.github.com/geoHeil/1752b46d6d38bdbbc460556e38263bc3 奇怪的是:slave中的用户是root。

那么为什么我无法访问 docker.sock?或者我怎样才能在 --privileged 标志中刻录以便权限被拒绝的问题消失?

随着 docker 1.10 引入了一个新的用户命名空间,因此共享 docker.sock 是不够的,因为容器内的 root 不再是主机上的 root。 我最近也在玩 Jenkins 容器,我想使用主机 docker 引擎构建容器。 我做的步骤是:

查找 docker 组的组 ID:

$ id
..... 999(docker)

运行 jenkins 容器有两个卷——一个包含 docker 客户端可执行文件,另一个共享 docker unix 套接字。请注意我如何使用 --group-add 将容器用户添加到 docker 组,以允许访问:

docker run --name jenkins -tid -p 8080:8080 --group-add=999 -v /path-to-my-docker-client:/home/jenkins/docker -v /var/run/docker.sock:/var/run/docker.sock jenkins

测试发现确实有效:

docker exec -ti jenkins bash
./docker ps

查看有关其他群组的更多信息here

另一种方法是使用 --privileged 标志而不是 --group-add,但最好尽可能避免使用它