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