docker-compose挂载ssh-agent后权限变更致非root用户权限拒绝求助
解决Docker-Compose挂载SSH代理套接字权限问题
问题背景
Dockerfile中创建/ssh-agent并设置权限为666,但通过docker-compose启动容器时,挂载/run/host-services/ssh-auth.sock到容器内/ssh-agent后,权限被重置为755,导致非root用户(UID 1001)因无写入权限无法拉取代码。手动修改权限后可正常操作,但重启容器后权限会再次被覆盖,且主机上的/run/host-services/ssh-auth.sock是Docker魔法卷,无法直接修改权限。
可行解决方案
方案1:通过Entrypoint脚本启动时修正权限
创建启动脚本,在容器启动后临时切换到root修改套接字权限,再执行原启动命令:
- 项目根目录创建
entrypoint.sh脚本:
#!/bin/sh # 临时修正ssh-agent权限 chmod 666 /ssh-agent # 执行容器原有启动命令 exec "$@"
- 给脚本添加执行权限:
chmod +x entrypoint.sh
- 修改Dockerfile,引入脚本并设置为Entrypoint:
RUN touch /ssh-agent && chmod 666 /ssh-agent COPY entrypoint.sh /usr/local/bin/ ENTRYPOINT ["entrypoint.sh"] # 保留原有CMD(如果有) # CMD ["your-original-start-command"]
docker-compose.yml无需修改,启动时脚本会自动完成权限修正。
方案2:利用Docker原生SSH代理转发
既然docker-compose已配置ssh: - default,可直接使用Docker原生的SSH代理转发功能,跳过手动挂载套接字的步骤:
修改docker-compose.yml,移除卷挂载配置:
build: dockerfile: Dockerfile ssh: - default restart: always user: "1001" # 删除原volumes配置块
Docker会自动处理SSH代理的权限映射,非root用户可直接使用SSH拉取代码。
方案3:给容器添加权限能力
通过cap_add给容器添加CAP_CHOWN权限,让非root用户能修改套接字权限:
修改docker-compose.yml:
build: dockerfile: Dockerfile ssh: - default restart: always user: "1001" cap_add: - CAP_CHOWN volumes: - type: bind source: /run/host-services/ssh-auth.sock target: /ssh-agent
之后可在容器启动命令或应用初始化步骤中加入chmod 666 /ssh-agent,非root用户将有权限执行该操作。
总结
- 方案1最稳妥,通过启动脚本修正权限,不涉及主机配置修改;
- 方案2最简洁,利用Docker原生功能避免手动挂载的权限问题;
- 方案3适合需要保留挂载配置的场景,通过添加权限能力实现非root用户修改权限。
内容的提问来源于stack exchange,提问作者scott_m
相关产品推荐
相关产品推荐

