Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从容器内部访问docker.sock_Linux_Jenkins_Docker - Fatal编程技术网

Linux 从容器内部访问docker.sock

Linux 从容器内部访问docker.sock,linux,jenkins,docker,Linux,Jenkins,Docker,我正在运行一个jenkins docker容器,我需要从中构建和运行docker。容器是使用-v/var/run/docker.sock:/var/run/docker.sock启动的。 问题是,当jenkins(从容器内部)尝试使用它时,我被拒绝访问 这就是我到目前为止一直尝试但没有成功的方法: 在主机中创建jenkins用户并将其添加到docker组 使用-G jenkins参数启动docker守护进程,使套接字由jenkins组而不是docker组拥有。Jenkins正在与属于容器内Je

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

这就是我到目前为止一直尝试但没有成功的方法:

  • 在主机中创建jenkins用户并将其添加到docker组
  • 使用
    -G jenkins
    参数启动docker守护进程,使套接字由jenkins组而不是docker组拥有。Jenkins正在与属于容器内Jenkins组的Jenkins用户一起执行
唯一有效的是一个我一点也不喜欢的“黑客”:我修改了容器中jenkins组的id,以匹配
docker.sock
的组id


任何关于如何以更优雅的方式解决此问题的建议都将不胜感激。

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

如果您正在容器中运行某个内容,并且希望它能够访问主机上的某个内容,则必须以root身份在容器中运行该内容,或者必须在主机和容器之间进行uid/gid同步

处理后一个问题的一种方法是在启动容器时传入目标GID,然后在启动CMD之前让入口点脚本设置相应的用户/组。比如:

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

exec "$@"

我也遇到了类似的问题,最后只是给了詹金斯用户无密码sudo权限。这意味着我必须在所有docker命令的前面加上sudo,但它可以工作,并且可以在主机之间移植。

您可以创建一个特殊的映像,让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"]

你能试着关闭防火墙/iptables吗?