11

我正在尝试在运行 Docker for Mac 17.06.0-ce-mac17 的 OSX 主机上从正在运行的 jenkins docker 容器(jenkins:latest)中调用 docker,按照http://jpetazzo.github.io/中描述的过程2015/09/03/do-not-use-docker-in-docker-for-ci/。</p>

我将 /var/run/docker.sock 挂载到容器中,我在其中粘贴了一个 ubuntu docker 二进制文件,它能够执行 - 但是当我运行时从容器内部以用户“jenkins”的身份运行,例如“docker ps”我得到

尝试在 unix:///var/run/docker.sock 连接到 Docker 守护程序套接字时获得权限被拒绝:获取http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json?all= 1:拨打 unix /var/run/docker.sock:连接:权限被拒绝。</p>

如果我以 root (docker exec -u 0) 身份连接到容器,它可以工作。

我需要 jenkins 用户才能运行它。我尝试在 ubuntu 容器中添加一个 docker 组并将 jenkins 添加到它,但这没有帮助,因为它与外部无关,而且 Docker for Mac 不像在 linux 上运行它那样工作,你可以做半简单uid/gid 匹配。我想分发这个容器,所以去破解我的 Docker for Mac 安装的一部分的答案不会真正帮助我。如果可以的话,我宁愿不以 root 身份运行整个 jenkins 设置。(我还尝试以特权身份运行容器,但没有帮助。)

根据 Permission Denied 中的建议,在 Macbook 中运行 Jenkins 管道时尝试连接到 Docker Daemon,我将容器内的 /var/run/docker.sock 文件手动分配给 jenkins,现在 jenkins 可以运行 docker。但是我在想出一个可分发容器的解决方案时遇到了麻烦——我不能在 Dockerfile 中做那个 chown,因为该文件还不存在,并且填充到入口点并没有帮助,因为它作为 jenkins 运行.

为了构建和运行将在我的 Mac 上作为非 root 用户从容器内部运行外部 docker 容器的映像,我需要做什么?

4

4 回答 4

3

按照这个:https ://forums.docker.com/t/mounting-using-var-run-docker-sock-in-a-container-not-running-as-root/34390

基本上,您需要做的就是更改/var/run/docker.sock容器内的权限并使用sudo.

我创建了一个可用于帮助的 Dockerfile:

FROM jenkinsci/blueocean:latest

USER root
# change docker sock permissions after moutn
RUN if [ -e /var/run/docker.sock ]; then chown jenkins:jenkins /var/run/docker.sock; fi
于 2019-01-28T09:39:40.730 回答
1

我得到了这个工作,至少是自动化的,但目前只在 Mac 的 docker 上工作。 Docker for Mac 有一个独特的文件权限模型。向 jenkins 用户手动输入 /var/run/docker.sock 可以工作,并且它会在容器重新启动甚至图像重新生成时持续存在,但不会在 docker 守护进程重新启动之后。另外,您不能在 Dockerfile 中执行 chown,因为 docker.sock 尚不存在,并且您无法在入口点中执行此操作,因为它作为 jenkins 运行。

所以我所做的就是将 jenkins 添加到“staff”组,因为在我的 Mac 上,/var/run/docker.sock 被符号链接到 /Users//Library/Containers/com.docker.docker/Data/‌​s60并且是uid和gid的工作人员。这让 jenkins 用户可以在主机上运行 docker 命令。

Dockerfile:

FROM jenkins:latest

USER root

RUN \
    apt-get update && \
    apt-get install -y build-essential && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

COPY docker /usr/bin/docker

# To allow us to access /var/run/docker.sock on the Mac
RUN gpasswd -a jenkins staff

USER jenkins

ENTRYPOINT ["/bin/tini", "--", "/usr/local/bin/jenkins.sh"]

docker-compose.yml 文件:

version: "3"
services:
  jenkins:
    build: ./cd_jenkins
    image: cd_jenkins:latest
    ports:
      - "8080:8080"
      - "5000:5000"
    volumes:
      - ./jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock

但是,这不能移植到其他系统(并且取决于 mac 组保持“员工”的 docker,我想这不能保证)。我希望提出改进建议,以使此解决方案跨主机系统工作。在Execute docker host command inside jenkins docker container等问题中建议的其他选项包括:

  • 安装 sudo 并让 jenkins sudo 并使用 sudo 运行所有 docker 命令:添加安全问题
  • “将 jenkins 添加到 docker 组” - 仅限 UNIX,并且可能依赖于匹配从主机到容器的 gid 对吗?
  • 设置包含的 docker 可执行文件可能会起作用,但与 sudo 具有相同的安全提升问题。
于 2017-07-12T20:51:14.280 回答
1

另一种对我有用的方法 - 将 uid 参数设置为拥有 /var/run/docker.sock 的 uid(在我的情况下为 501)。不确定 Dockerfile 的语法,但是对于 docker-compose.yml,它是这样的:

version: 3
services:
  jenkins:
    build:
      context: ./JENKINS
      dockerfile: Dockerfile
      args:
        uid: 501
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ...

请注意,这是基于使用 Dockerfile 构建 jenkins 映像,因此省略了很多细节。这里的关键位是uid: 501under args

于 2019-03-29T16:23:44.597 回答
0

感谢@mxyzplk 的帖子。

它对我有用:“手动向 MacOS 用户添加 /var/run/docker.sock 可以工作,并且它会在容器重新启动甚至图像重新生成时持续存在,但不会在 docker 守护进程重新启动之后。”

我的命令记录

于 2022-01-21T08:05:23.433 回答