当前位置: 首页 > 面试题库 >

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

甄德寿
2023-03-14
问题内容

我正在尝试按照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容器上,我该怎么办?


问题答案:

我可以正常工作,至少是自动化的,但目前仅在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一样存在安全性提升问题。


 类似资料:
  • 本文向大家介绍以非root用户身份运行Docker容器,包括了以非root用户身份运行Docker容器的使用技巧和注意事项,需要的朋友参考一下 当您在Docker容器中运行应用程序时,默认情况下,它有权访问所有root特权。您可能已经注意到,当打开Ubuntu Docker Container Bash时,默认情况下您以root用户身份登录。在应用程序的安全性方面,这可能是一个主要问题。任何局外人

  • 问题内容: 运行时默认 要么 您以root用户身份连接到终端,但是我想以其他用户身份连接。这可能吗? 问题答案: 对于: 在启动Docker容器时,只需添加选项即可更改为其他用户。 对于或: 由于该命令用于附加/执行到现有进程中,因此它直接在此使用当前用户。 如果您确实想附加到想要拥有的用户,那么 从该用户开始或在您的使用中提及它 使用`su更改用户

  • 问题内容: 在昨天的Shocker消息发布之后,似乎Docker容器中的应用程序不应以root用户身份运行。我尝试更新自己以创建应用程序用户,但是更改对应用程序文件的权限(虽然仍然是root)似乎不起作用。我猜这是因为未将某些LXC权限授予root用户? 这是我的Dockerfile: 很简单,但是当我一切仍然由root拥有时: 感谢@creak对卷的工作原理的澄清,我更新的dockerfile的

  • 问题内容: 我运行 npm install lodash, 但它抛出 错误:EACCES:权限被拒绝 错误。我知道这是权限问题,但据我所知,本地安装节点模块不需要sudo权限。如果我使用sudo运行它,它将安装在〜/ node_modules文件夹中。 drwxrwxr-x 是现有文件夹的文件许可权。我不知道可能出了什么问题。 下面是错误消息。 问题答案: 使用 npm init 创建 packa

  • 我运行npm install lodash,但它抛出错误:EACCES:权限被拒绝错误。我知道这是权限问题,但据我所知,在本地安装节点模块不需要sudo权限。如果我用sudo运行它,它会安装在~/node\u modules文件夹中。drwxrwxr-x是现有文件夹的文件权限。我不知道可能出了什么问题。 下面是错误消息。

  • 我在Ruby 2.0.0-p353和OSX Mavericks上使用Rails 4.0.2、Guard 2.2.4、Guard rspec 4.2.4、rspec Rails 2.14.0、Capybara 2.2.1和Poltergeist 1.5.0。 当我运行bundle exec Guard时,我得到了很多失败的错误消息:一个错误发生在后钩子Errno::EACCES:权限拒绝- /usr