【问题标题】:How to mount docker socket as volume in docker container with correct group如何在具有正确组的 docker 容器中将 docker socket 挂载为卷
【发布时间】:2016-07-11 03:34:46
【问题描述】:

我想在 docker 容器中运行 Jenkins 实例。

我希望 Jenkins 本身能够启动 docker 容器作为从属来运行测试。

似乎最好的方法是使用

docker run -v /var/run.docker.sock:/var/run/docker.sock -p 8080:8080 -ti my-jenkins-image

source

我使用的Dockerfile

FROM jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

USER root
RUN apt-get update && apt-get install -y docker.io
RUN usermod -aG docker jenkins
USER jenkins

如果我在正在运行的容器中启动 bash 会话并在我的图像上运行 docker info,我会得到 ​​p>

$ docker info
FATA[0000] Get http:///var/run/docker.sock/v1.18/info: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?

如果我以 root 身份运行 bash 会话

docker exec -u 0 -ti cocky_mccarthy bash
root@5dbd0efad2b0:/# docker info
Containers: 42
Images: 50
...

所以我猜我要添加 Jenkins 用户的 docker 组是内部 docker 的组,因此如果没有 sudo,套接字将无法读取。这是一个问题,因为 Jenkins docker 插件等未设置为使用 sudo

如何安装套接字,以便在没有sudo 的情况下从图像中使用它?

【问题讨论】:

  • 您找到解决问题的方法了吗?我现在也面临同样的问题
  • 我的解决方案是在容器启动后更改 docker.sock 的所有权。 docker exec -it -u root jenkins-docker chown jenkins /var/run/docker.sock

标签: docker jenkins dockerfile jenkins-docker


【解决方案1】:

我使用了你的 dockerfile,但做了一个小编辑:

FROM jenkins
COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt

USER root
RUN apt-get update
RUN groupadd docker && gpasswd -a jenkins docker
USER jenkins

构建映像后,我可以使用它来启动它(我在 centos7 上):

docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
     -v $(which docker):/usr/bin/docker:ro \
     -v /lib64/libdevmapper.so.1.02:/usr/lib/x86_64-linux-gnu/libdevmapper.so.1.02 \
     -v /lib64/libudev.so.0:/usr/lib/x86_64-linux-gnu/libudev.so.0 \
     -p 8080:8080 \
     --name jenkins \
     --privileged=true -t -i \
test/jenkins

您尝试在映像中安装包 docker.io。但是这个包也在你的主机上(否则不可能在它上面运行 docker 容器)。因此,建议将其挂载到您的容器中,而不是将其安装在您的 docker 文件中。 我认为挂载的 /lib64/... 是 Centos 7 特有的。

$ docker exec -it 9fc27d5fcec1 bash
jenkins@9fc27d5fcec1:/$ whoami 
jenkins
jenkins@9fc27d5fcec1:/$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
9fc27d5fcec1        test                "/bin/tini -- /usr/lo"   6 minutes ago       Up 6 minutes        0.0.0.0:8080->8080/tcp, 50000/tcp   jenkins

【讨论】:

  • 我和 OP 有同样的问题,我发现这篇文章很有帮助(尽管它不能解决权限问题)。 jpetazzo.github.io/2015/09/03/… 作者建议不要将 docker 二进制文件从主机挂载到容器:“这不再可靠,因为 Docker 引擎不再作为(几乎)静态库分发。”。
  • 前段时间看了一下。你的意思是这不再可靠了?我刚刚启动了一个容器并安装了 .sock 和 bin,我可以在其中使用 docker(1.12)还是我错了?谢谢
  • 老实说,我没有足够的知识给你一个正确的答案,我只是想指出我发布的链接不建议这样做。
  • 我可以在容器中使用 docker 并安装 sock + bin(这是 URL 中的“好”解决方案)。我似乎不必使用 --priviledged 标志。
  • 哦,现在我发现它不再可靠了。我必须探索的东西。
【解决方案2】:

有点晚了,但这可能会对其他遇到同样问题的用户有所帮助:

这里的问题是您的 docker 主机上的 docker 组的组 ID 与容器内的 docker 组的 ID 不同。由于守护进程只关心 id 而不是组的名称,因此您的解决方案只有在这些 id 偶然匹配时才有效。

解决这个问题的方法是在启动 Docker 引擎时使用-H option 使用 tcp 而不是使用 unix 套接字。您应该非常小心,因为这允许任何有权访问此端口的人获得对您系统的 root 访问权限。

解决此问题的更安全方法是确保容器内的docker 组最终与容器外的docker 组具有相同的组ID。您可以使用 docker build 的构建参数来执行此操作:

Dockerfile:

FROM jenkinsci
ARG DOCKER_GROUP_ID

USER root
RUN curl -o /root/docker.tgz https://get.docker.com/builds/Linux/x86_64/docker-1.12.5.tgz && tar -C /root -xvf /root/docker.tgz && mv /root/docker/docker /usr/local/bin/docker && rm -rf /root/docker*
RUN curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN groupadd -g $DOCKER_GROUP_ID docker && gpasswd -a jenkins docker
USER jenkins

然后使用构建它

docker build \ 
  --build-arg DOCKER_GROUP_ID=`getent group docker | \ 
  cut -d: -f3` -t my-jenkins-image .

在此之后,您可以运行您的映像并以非 root 身份访问 docker

docker run \ 
  -v /var/run/docker.sock:/var/run/docker.sock \ 
  -p 8080:8080 \
  -ti my-jenkins-image

由于此解决方案依赖于在构建映像时向 docker 守护程序提供正确的组 ID,因此该映像需要在使用它的机器上构建。如果您构建映像,然后将其推送,然后其他人将其拉到他们的机器上,则组 ID 很可能不会再次匹配。

【讨论】:

  • 确保docker 组 ID 在主机和容器内保持一致正是我们在遇到相同问题时需要解决的问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 2017-07-21
  • 2021-09-17
  • 1970-01-01
  • 2021-07-02
  • 2017-04-15
  • 1970-01-01
相关资源
最近更新 更多