如何找出哪个用户正在访问 /var/run/docker.sock 会导致权限被拒绝的错误
How to find out which user is accessing /var/run/docker.sock that will cause permission denied error
此题与以下题不同:
Docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock 因为他们没有考虑将 jenkins 安装为 docker 容器,所以这里我没有 jenkins 用户来授予该用户访问该文件的权限。
还有这个 因为我不知道我为哪个用户收到这个错误,这里的用户 root
可以访问这个文件但是错误又发生了。
这是我的问题:
我想 运行 docker jenkinsci/blueocean
图像在 ubuntu 上使用以下命令:
docker container run \
--name jenkins-blueocean \
--rm \
--detach \
--publish 8181:8080 \
--publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
--volume /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
运行当我按如下方式使用代理时在 dokcer 容器上安装 jenkins 之后:
agent {
docker {
image 'maven:3-alpine'
}
}
我收到以下错误:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/create?fromImage=maven&tag=3-alpine: dial unix /var/run/docker.sock: connect: permission denied
这里当我使用这个命令时它会解决问题:
chmod 777 /var/run/docker.sock
但由于安全漏洞,我不想允许所有用户访问此套接字。
我还应该说当前用户是 root 并且它可以访问 /var/run/docker.sock
这里有一些有用的信息:
echo $USER
root
ls -ls /var/run/docker.sock
srw-rw---- 1 root docker 0 Jul 24 14:56 /var/run/docker.sock
groups
root docker
我应该允许哪个用户访问此文件? jenkins 运行 在容器上,我的系统上没有 jenkins 用户,我如何找出哪个用户正在尝试访问此套接字文件 /var/run/docker.sock
并因此出现此错误?
根据 Jenkins downloading-and-running-jenkins-in-docker 文档:
4.为了在 Jenkins 节点内执行 Docker 命令,下载并 运行 docker:dind
Docker in Docker(dind) 允许 Docker 引擎 运行 作为容器在 Docker - 这是一种感觉很直观的开始。
我刚刚复制并使用这些命令对我来说工作得很好(我还在启动选项中包含 --privileged
。不确定它是否是强制性的):
docker container prune -f;
docker container run --name jenkins-docker --detach --privileged --network jenkins --network-alias docker --env DOCKER_TLS_CERTDIR=/certs --volume jenkins-docker-certs:/certs/client --volume jenkins-data:/var/jenkins_home --publish 2376:2376 docker:dind;
docker container run --name jenkins-blueocean --rm --detach --privileged --network jenkins --env DOCKER_HOST=tcp://docker:2376 --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 --publish 8080:8080 --publish 50000:50000 --volume jenkins-data:/var/jenkins_home --volume jenkins-docker-certs:/certs/client:ro jenkinsci/blueocean
但是,在dind repo README.md 的最顶部,您可以找到以下强烈反对上述设置的声明(感谢@David指向这个的迷宫):
If you came here because you would like to run a testing system like Jenkins in a container, and want that container to spin up more containers, then please read this blog post first. Thank you!
我个人在家里自己的操场上使用它,我经常在那里擦掉所有东西,风险由我自己承担。
如果您查看 jenkinsci/blueocean 的 Dockerfile,例如 1.23.2。您可以看到“jenkins”用户是 uid 1000 和 gid 1000。必须匹配这些 ID 才能进行卷访问,而不是用户名。
与其在主机上授予 uid/gid 1000 对 /var/run/docker.sock 的访问权限,不如 运行 容器作为具有权限的 user/group 可能更好.您可以使用 id -u root
和 id -g docker
检查,然后将其与您的 docker run
命令一起使用,例如(假设 root uid 为 0),docker run -u 0 ...
。有关如何使用 -u
/--user
的更多示例,请参阅 doc page。如果您 运行 在容器中使用与 root 相同的 uid,您可能不会有问题,但如果是不同的 id,您可能 运行 与其他 uid 一样出现问题可能缺少必要的配置才能正确 运行 Jenkins 的东西。
如果你真的想走改变/var/run/docker.sock的路线,那么答案是创建一个gid 1000的组并向其中添加root我猜的组。
This repo 可能包含您问题的解决方案,我最近尝试过,效果很好。
请记住,jenkinsci/blueocean 图像已过时,目前已被 Jenkins 弃用。
如果您更喜欢使用官方 jenkins/jenkins 图片,利用 docker.sock 交流 - 您可以通过将问题发布到 Jenkins Docker packaging and plugin channel 找到解决方案
此题与以下题不同:
Docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock 因为他们没有考虑将 jenkins 安装为 docker 容器,所以这里我没有 jenkins 用户来授予该用户访问该文件的权限。
还有这个 root
可以访问这个文件但是错误又发生了。
这是我的问题:
我想 运行 docker jenkinsci/blueocean
图像在 ubuntu 上使用以下命令:
docker container run \
--name jenkins-blueocean \
--rm \
--detach \
--publish 8181:8080 \
--publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
--volume /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
运行当我按如下方式使用代理时在 dokcer 容器上安装 jenkins 之后:
agent {
docker {
image 'maven:3-alpine'
}
}
我收到以下错误:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/create?fromImage=maven&tag=3-alpine: dial unix /var/run/docker.sock: connect: permission denied
这里当我使用这个命令时它会解决问题:
chmod 777 /var/run/docker.sock
但由于安全漏洞,我不想允许所有用户访问此套接字。
我还应该说当前用户是 root 并且它可以访问 /var/run/docker.sock
这里有一些有用的信息:
echo $USER
root
ls -ls /var/run/docker.sock
srw-rw---- 1 root docker 0 Jul 24 14:56 /var/run/docker.sock
groups
root docker
我应该允许哪个用户访问此文件? jenkins 运行 在容器上,我的系统上没有 jenkins 用户,我如何找出哪个用户正在尝试访问此套接字文件 /var/run/docker.sock
并因此出现此错误?
根据 Jenkins downloading-and-running-jenkins-in-docker 文档:
4.为了在 Jenkins 节点内执行 Docker 命令,下载并 运行 docker:dind
Docker in Docker(dind) 允许 Docker 引擎 运行 作为容器在 Docker - 这是一种感觉很直观的开始。
我刚刚复制并使用这些命令对我来说工作得很好(我还在启动选项中包含 --privileged
。不确定它是否是强制性的):
docker container prune -f;
docker container run --name jenkins-docker --detach --privileged --network jenkins --network-alias docker --env DOCKER_TLS_CERTDIR=/certs --volume jenkins-docker-certs:/certs/client --volume jenkins-data:/var/jenkins_home --publish 2376:2376 docker:dind;
docker container run --name jenkins-blueocean --rm --detach --privileged --network jenkins --env DOCKER_HOST=tcp://docker:2376 --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 --publish 8080:8080 --publish 50000:50000 --volume jenkins-data:/var/jenkins_home --volume jenkins-docker-certs:/certs/client:ro jenkinsci/blueocean
但是,在dind repo README.md 的最顶部,您可以找到以下强烈反对上述设置的声明(感谢@David指向这个的迷宫):
If you came here because you would like to run a testing system like Jenkins in a container, and want that container to spin up more containers, then please read this blog post first. Thank you!
我个人在家里自己的操场上使用它,我经常在那里擦掉所有东西,风险由我自己承担。
如果您查看 jenkinsci/blueocean 的 Dockerfile,例如 1.23.2。您可以看到“jenkins”用户是 uid 1000 和 gid 1000。必须匹配这些 ID 才能进行卷访问,而不是用户名。
与其在主机上授予 uid/gid 1000 对 /var/run/docker.sock 的访问权限,不如 运行 容器作为具有权限的 user/group 可能更好.您可以使用 id -u root
和 id -g docker
检查,然后将其与您的 docker run
命令一起使用,例如(假设 root uid 为 0),docker run -u 0 ...
。有关如何使用 -u
/--user
的更多示例,请参阅 doc page。如果您 运行 在容器中使用与 root 相同的 uid,您可能不会有问题,但如果是不同的 id,您可能 运行 与其他 uid 一样出现问题可能缺少必要的配置才能正确 运行 Jenkins 的东西。
如果你真的想走改变/var/run/docker.sock的路线,那么答案是创建一个gid 1000的组并向其中添加root我猜的组。
This repo 可能包含您问题的解决方案,我最近尝试过,效果很好。 请记住,jenkinsci/blueocean 图像已过时,目前已被 Jenkins 弃用。
如果您更喜欢使用官方 jenkins/jenkins 图片,利用 docker.sock 交流 - 您可以通过将问题发布到 Jenkins Docker packaging and plugin channel 找到解决方案