权限被拒绝从Docker Ubuntu容器中作为非root用户

时间:2017-07-09 17:14:06

标签: macos ubuntu docker jenkins docker-in-docker

我试图在运行jenkins docker容器(jenkins:latest)内部运行Docker for Mac 17.06.0-ce-mac17的OSX主机上调用docker,按照{{3 }}。

我将/var/run/docker.sock挂载到容器中,我在其中粘贴了一个ubuntu docker二进制文件,并且它能够执行 - 但是从容器内部作为用户" jenkins&#34 ;当我跑步,例如" docker ps"我得到了

  

尝试在unix上连接到Docker守护程序套接字时获得权限被拒绝:///var/run/docker.sock:获取http://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/:拨打unix /var/run/docker.sock:connect:permission否认。

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

我需要jenkins用户才能运行它。我尝试添加一个docker组并在ubuntu容器中添加jenkins,但这没有帮助,因为它与外部无关,而Docker for Mac并不像运行这个在Linux上你可以做半容易的uid / gid匹配。我想分发这个容器,所以我的Docker for Mac安装的部分内容和黑客攻击对我来说真的很有帮助。如果我能帮助它,我宁愿不以root身份运行整个jenkins设置。 (我也尝试过将容器作为特权运行,但没有帮助。)

根据http://%2Fvar%2Frun%2Fdocker.sock/v1.30/containers/json?all=1中的建议,我手动将容器内的/var/run/docker.sock文件与jenkins联系起来,现在jenkins可以运行docker。但是我在为可分发的容器提出解决方案时遇到了麻烦 - 我无法在Dockerfile中执行此操作,因为该文件尚未存在,并且填入入口点并不会出现问题。 ; t help,因为它以jenkins的形式运行。

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

3 个答案:

答案 0 :(得分: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: 501下的args

答案 1 :(得分:0)

我得到了这个,至少是自动化的,但目前只在Mac上使用docker。 Docker for Mac has a unique file permission model。 chowning /var/run/docker.sock给jenkins用户手动工作,它会在容器重启甚至映像重新生成时保持不变,但不会重启docker守护进程。另外,你不能在Dockerfile中执行chown,因为docker.sock还不存在,你不能在入口点执行,因为它以jenkins的形式运行。

所以我所做的就是将詹金斯添加到"员工" group,因为在我的Mac上,/ var / run / docer.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 group的工作人员和#34;工作人员,"我认为这不是保证)。我喜欢建议的改进,以使此解决方案适用于主机系统。 Execute docker host command inside jenkins docker container等问题中建议的其他选项包括:

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

答案 2 :(得分:0)

关注此: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