【问题标题】:Run Docker as jenkins-agent, in a docker-container, as non-root user在 docker-container 中以 jenkins-agent 身份运行 Docker,以非 root 用户身份运行
【发布时间】:2019-06-24 09:59:43
【问题描述】:

类似问题

Dockerfile

FROM  jenkins/jenkins:lts
USER root
RUN apt-get -qq update  && apt-get -qq -y install --no-install-recommends curl
RUN curl -sSL https://get.docker.com/ | sh
RUN usermod -aG docker jenkins
USER jekins

终端命令

docker run -p 8080:8080 -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -ti bluebrown/docker-in-jenkins-in-docker /bin/bash

容器内

docker image ls

输出

Got permission denied while trying to connect to the Docker daemon
socket at unix:///var/run/docker.sock: Get
http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/json: dial unix
/var/run/docker.sock: connect: permission denied

当我注释掉 dockerfile 的最后一行,以 root 用户身份运行实例时,

# USER jenkins

出于显而易见的原因,我可以毫无问题地访问 docker 套接字。但是,我认为这不是一个适当的解决方案。这就是为什么我想问是否有人设法以非 root 用户身份访问 docker 套接字。

【问题讨论】:

标签: docker jenkins permissions


【解决方案1】:

在您的 dockerfile 中,您正在为用户 jenkins 启用 docker 访问,但下拉到用户 jekins 而不是 jenkins?

这只是这个页面上的一个错字吗?

我使用了您所描述的这种方法,它可以正常工作。

【讨论】:

  • 也许你是对的。我想我从来没有看到你的答案。
【解决方案2】:

您已将 docker 组添加到容器内的 Jenkins 用户。但是,这不一定有效,因为用户和组到 uid 和 gid 的映射在主机和容器之间可能不同。这通常不是问题,但是通过将主机卷和其他绑定挂载到容器中,文件将使用相同的 uid/gid 以及权限进行映射。因此,在容器内部,docker 组将无法访问 docker 套接字,除非两个环境之间的 gid 恰好相同。

有几种解决方案,包括手动传递主机 gid 作为在容器内使用的 gid。或者您可以获取主机的 gid 并使用硬编码的值构建图像。

我的首选解决方案是以 root 身份启动入口点,修复容器内的 docker 组以匹配已安装的 docker 套接字的 gid,然后切换到 Jenkins 用户以启动应用程序。这在可能难以控制 uid/gid 的开发环境中特别有效。这方面的所有步骤/脚本都在我的仓库中:https://github.com/sudo-bmitch/jenkins-docker

对于受控环境中的生产,我尝试在主机和容器中为任何挂载主机卷的东西获取标准化的 uid/gid 值。然后我可以在没有根入口点步骤的情况下运行容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2014-08-10
    • 2018-01-30
    相关资源
    最近更新 更多