Docker容器内通过Python subprocess重启其他容器时遭遇权限拒绝问题
Docker容器内通过Python subprocess重启其他容器时遭遇权限拒绝问题
看起来你遇到的是Docker套接字的权限匹配问题——虽然你已经在Dockerfile里把myuser加入了docker组,但容器内创建的docker组的GID(组ID)大概率和宿主机上docker组的GID不一致,导致即使在容器内属于docker组,也没有权限访问宿主机的/var/run/docker.sock。
问题根源
宿主机的/var/run/docker.sock套接字文件,其所属组是宿主机本地的docker组。而你在Dockerfile中用groupadd -f docker创建的组,GID是容器内系统自动分配的,几乎不可能和宿主机的docker组GID完全一致。这就导致容器内的myuser虽然名义上属于docker组,但这个组和宿主机控制套接字权限的docker组不是同一个“身份”,自然会被拒绝访问。
具体解决步骤
获取宿主机的docker组GID
在宿主机终端执行以下命令,找到docker组的ID:getent group docker输出示例:
docker:x:998:,其中998就是我们需要的GID(你的环境中可能是其他数字)。修改Dockerfile,对齐docker组GID
将Dockerfile中创建docker组的命令,改为指定宿主机GID的版本,替换成你刚才拿到的数字:RUN groupadd -g 998 -f docker && usermod -aG docker myuser这样容器内的
docker组就和宿主机的docker组拥有完全相同的GID,权限匹配问题就能解决。额外优化建议
- 你的Python代码中,
subprocess.run可以去掉shell=True,改用列表形式的命令参数,这不仅更安全(避免shell注入风险),也更符合subprocess的最佳实践:result = subprocess.run( ["docker", "restart", "mc"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True ) - 其实容器内不需要安装完整的
docker.io包,只需要Docker客户端docker-ce-cli就足够通过套接字调用宿主机的Docker daemon,这样可以减少镜像体积,修改后的安装命令:RUN apt-get update && apt-get install -y \ docker-ce-cli \ && apt-get clean
- 你的Python代码中,
验证
重新构建镜像并启动容器,权限拒绝的错误应该就会消失,你的Python脚本可以正常通过docker.sock重启mc容器了。
备注:内容来源于stack exchange,提问作者CapWater
相关产品推荐
相关产品推荐

