繁体   English   中英

Permission denied error invoking Docker on Mac host from inside Docker Ubuntu 容器作为非根用户

[英]Permission denied error invoking Docker on Mac host from inside Docker Ubuntu container as non-root user

I'm trying to invoke docker on my OSX host running Docker for Mac 17.06.0-ce-mac17 from inside a running jenkins docker container ( jenkins:latest ), per the procedure described at http://jpetazzo.github.io/ 2015/09/03/不要使用 docker-in-docker-for-ci/

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

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

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

我需要 jenkins 用户才能运行它。 我尝试添加一个 docker 组并在 ubuntu 容器内向其添加 jenkins 但这没有帮助,因为它与外部无关,Mac 的 Docker 无法像在 linux 上运行它一样工作,您可以在其中进行半简单操作uid/gid 匹配。 我想分发这个容器,以便回答 go 和破解我的 Docker 的一部分,用于 Mac 安装不会真正帮助我。 如果可以的话,我宁愿不以 root 身份运行整个 jenkins 设置。 (我还尝试以特权方式运行容器,但没有帮助。)

根据Permission Denied while trying to connect to Docker Daemon while running Jenkins pipeline in Macbook 中的建议,我手动将容器内的 /var/run/docker.sock 文件更改为 881438880936288,现在 jenkins 可以运行 docker。但我遇到了麻烦想出一个可分发容器的解决方案——我不能在 Dockerfile 中执行该操作,因为该文件尚不存在,并且填充到入口点也无济于事,因为它以 jenkins 运行。

我需要做什么才能构建和运行一个图像,该图像将在我的 Mac 上作为容器内部的非根用户运行外部 docker 容器?

另一种对我有用的方法 - 将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: 501下的args

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

所以我所做的是将jenkins添加到“staff”组,因为在我的Mac上,/ var / run / disker.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 staff”的docker“工作人员”,我想这是不可保证的)。 我喜欢建议的改进,使这个解决方案适用于主机系统。 在jenkins docker容器内的执行docker host命令等问题中建议的其他选项包括:

  • 安装sudo并让jenkins sudo并使用sudo运行所有docker命令:添加安全问题
  • “将jenkins添加到docker组” - 仅限UNIX,可能依赖于从主机到容器的gid匹配吗?
  • Setuid包含的docker可执行文件可能有效,但与sudo具有相同的安全性提升问题。

请遵循: https//forums.docker.com/t/mounting-using-var-run-docker-sock-in-a-container-not-running-as-root/34390

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

我创建了一个可以用来帮助的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

感谢@mxyzplk 的帖子。

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

我的命令记录

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM