You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带SSH服务的Docker容器使用--user参数启动失败问题咨询

非root用户运行open_ssh容器解决方案

问题根因

sshd: no hostkeys available -- exiting报错的核心原因是:SSH服务启动时必须读取/etc/ssh目录下ssh_host_*开头的主机密钥文件,这类文件默认属主为root、权限为0600,你指定的非root用户没有读取权限,导致服务启动失败。同时非root用户默认无法绑定1024以下的端口,默认22端口也会触发权限不足问题。

推荐方案:修改Dockerfile支持任意非root用户运行

该方案适配任意UID的非root用户启动,无需额外调整启动参数:

  • 第一步:新增entrypoint权限调整脚本,在项目目录下新建entrypoint.sh,内容如下:
#!/bin/sh
# 调整密钥、运行目录权限为当前启动用户所有
chown -R $(id -u):$(id -g) /etc/ssh /run/sshd
chmod 600 /etc/ssh/ssh_host_*
# 启动sshd,监听非特权端口2222
exec /usr/sbin/sshd -D -p 2222
  • 第二步:修改Dockerfile配置,在原有配置基础上新增以下内容:
# 保留你原有open_ssh相关的构建逻辑
# 新增以下配置
# 生成ssh主机密钥
RUN ssh-keygen -A && \
    # 创建sshd运行时目录
    mkdir -p /run/sshd && \
    # 放开ssh目录和运行目录的属主修改权限,给entrypoint脚本执行权限
    chmod 777 /etc/ssh /run/sshd && \
    chmod +x /path/to/entrypoint.sh
# 替换为你的entrypoint.sh实际路径
ENTRYPOINT ["/path/to/entrypoint.sh"]
# 暴露非特权ssh端口
EXPOSE 2222
  • 第三步:重新构建镜像后,用任意非root用户启动即可:
docker run --user $(id -u):$(id -g) -p 2222:2222 <name>:<tag>

临时方案:无需修改镜像,调整启动命令

如果不想修改原有镜像,可以直接用以下命令启动,先以root身份调整权限再切换为目标用户运行sshd:

docker run --user root -p 2222:2222 <name>:<tag> \
sh -c "ssh-keygen -A && chown -R $(id -u):$(id -g) /etc/ssh /run/sshd && su - $(id -un) -c '/usr/sbin/sshd -D -p 2222'"

注意事项

  • SSH服务对密钥权限校验严格,主机密钥必须是0600权限,不能开放组或其他用户的读权限,否则会启动失败
  • 非root用户无法绑定1024以下的端口,必须将sshd监听端口改为1024以上的非特权端口,例如2222

内容的提问来源于stack exchange,提问作者ElPotac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:54:04