繁体   English   中英

从容器内部访问docker.sock

[英]Access docker.sock from inside a container

我正在运行一个jenkins docker容器,我需要从中构建并运行docker。 使用-v /var/run/docker.sock:/var/run/docker.sock启动容器。 问题是,当jenkins(来自容器内部)试图使用它时,我被拒绝访问。

这是我到目前为止没有运气的尝试:

  • 在主机中创建jenkins用户并将其添加到docker组。
  • 使用-G jenkins参数启动-G jenkins守护程序,以便套接字由jenkins组而不是docker组拥有。 Jenkins正在与一个jenkins用户一起执行,该用户属于容器内的jenkins组。

唯一有效的是我完全不喜欢的“黑客”:我修改了容器内jenkins组的id以匹配docker.sock的组ID。

如何以更优雅的方式解决这个问题的任何建议将不胜感激。

这听起来像是一个基本的Unix权限问题。 要访问文件(或套接字),您需要(a)为root或(b)具有允许您根据文件模式进行访问的数字UID或GID。

如果您在容器内运行某些东西并且希望它能够访问主机上的某些内容,那么您将不得不以root用户身份在容器内运行,或者您必须完成uid / gid同步主机和容器之间。

处理后一个问题的一种方法是在启动容器时传入目标GID,然后在启动CMD之前设置ENTRYPOINT脚本以建立适当的用户/组。 就像是:

if [ "$DOCKER_GID" ]; then
    groupadd -g $DOCKER_GID hostdocker
    usermod -a -G hostdocker jenkins
fi

exec "$@"

我有类似的问题,最后只给了jenkins用户无密码的sudo权限。 这意味着我必须使用sudo为所有docker命令添加前缀,但它可以在主机之间移植并且可以移植。

你可以创建一个特殊的图像与jenkins用户烘焙了docker GID。这可能被称为坏,因为它不可移植:

FROM jenkins

USER root

RUN groupadd -g 999 hostdocker && usermod -G hostdocker -a jenkins
RUN wget https://get.docker.io/builds/Linux/x86_64/docker-1.7.1 -O /usr/local/bin/docker && chmod +x /usr/local/bin/docker

USER jenkins

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

暂无
暂无

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

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