一尘不染

权限被拒绝错误以非root用户身份从Docker Ubuntu容器内部调用Mac主机上的Docker

jenkins

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

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

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

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

我需要jenkins用户能够运行它。我尝试在ubuntu容器中添加一个docker组并向其中添加jenkins,但这无济于事,因为它与外部无关,而且Mac的Docker无法像在Linux上运行此功能那样轻松完成uid
/ gid匹配。我想分发这个容器,所以回答并破解我的Docker for
Mac安装的一部分并不能真正帮助我。如果可以的话,我宁愿不以root用户身份运行整个jenkins安装程序。(我也尝试过以特权方式运行容器,这没有帮助。)

根据在Macbook中运行Jenkins管道时尝试连接到DockerDaemon时权限拒绝中的建议,我将容器内的/var/run/docker.sock文件手动更改为jenkins,现在jenkins可以运行docker。但是我在想出一个可分发容器的解决方案时遇到了麻烦-
我无法在Dockerfile中执行该操作,因为该文件尚不存在,并且进入入口点也无济于事,因为它作为詹金斯运行。

为了构建和运行映像,该映像将以非root用户身份从容器内部运行在Mac上的外部docker容器上,我该怎么办?


阅读 327

收藏
2020-07-25

共1个答案

一尘不染

我可以正常工作,至少是自动化的,但目前仅在Mac的docker上工作。
Mac的Docker具有独特的文件权限模型。手动将/var/run/docker.sock赋予jenkins用户有效,并且在容器重新启动甚至映像重新生成期间仍然存在,但过去的docker守护程序重新启动则不会。另外,您无法在Dockerfile中执行chown,因为docker.sock还不存在,并且您无法在入口点中执行,因为它作为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

但是,这不能移植到其他系统(并且该docker使Mac组保持“人员”,我想不能保证)。我很乐意提出改进建议,以使该解决方案能够在主机系统上正常工作。在诸如詹金斯(Jenkins)Docker容器内的Execute
docker host命令之类的问题中建议的其他选项包括:

  • 安装sudo并让jenkins sudo并使用sudo运行所有docker命令:增加了安全性问题
  • “将jenkins添加到docker组”-仅限于UNIX,可能依赖于将gid从主机匹配到容器,对吗?
  • 对包含的docker可执行文件执行setuid操作可能有效,但与sudo一样存在安全性提升问题。
2020-07-25