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

Docker无法识别主机密钥?sshd无可用主机密钥退出问题排查

问题

目标是从Jenkins容器SSH连接到remote_host容器,执行docker-compose up -d后remote_host容器随即退出,容器日志显示:

Unable to load host key: /etc/ssh/ssh_host_rsa_key
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.

相关环境信息:

  1. Jenkins目录文件结构:
-rw-rw-r--  1 miki miki  411 Oct 12 12:45 docker-compose.yml
-rw-rw-r--  1 miki miki   36 Sep 23 11:08 Dockerfile
drwxrwxr-x  8 miki miki 4096 Sep 23 13:24 .git/
drwxr-xr-x 18 root root 4096 Oct 12 12:46 jenkins_home/
drwxrwxr-x  8 miki miki 4096 Sep 23 13:23 react-app/
  1. docker-compose.yml配置:
services:

  jenkins:
    build: .
    container_name: jenkins
    privileged: true
    restart: always
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
  
  remote_host:
    container_name: remote_host
    image: remote_host
    build: 
      context: ../udemyjenkins/  
  1. remote_host的Dockerfile(位于../udemyjenkins/):
FROM ubuntu:latest
RUN apt update
RUN apt install -y openssh-server sudo vim-tiny

RUN useradd -ms /bin/bash -g root -G sudo -u 1000 remote_user
RUN  echo 'remote_user:ae******' | chpasswd -c SHA256

RUN service ssh start
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN bash -c 'install -m755 <(printf "#!/bin/sh\nexit 0") /usr/sbin/policy-rc.d'
RUN ex +'%s/^#\zeListenAddress/\1/g' -scwq /etc/ssh/sshd_config
RUN ex +'%s/^#\zeHostKey .*ssh_host_.*_key/\1/g' -scwq /etc/ssh/sshd_config
RUN RUNLEVEL=1 dpkg-reconfigure openssh-server
RUN ssh-keygen -A -v
RUN update-rc.d ssh defaults

RUN ex +"%s/^%sudo.*$/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" -scwq! /etc/sudoers

USER remote_user

RUN ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

问题原因与修复方案

核心问题

  1. 生成SSH主机密钥后未确保权限正确,容器启动时以remote_user身份运行的sshd进程无法读取/etc/ssh/下的主机密钥文件。
  2. RUN service ssh start属于无用命令——镜像构建阶段启动的进程会在构建完成后终止,不会延续到容器运行阶段。
  3. 用户切换时机过早,导致后续主机密钥权限配置无法以root身份完成。

修复步骤

修改remote_host的Dockerfile,调整用户切换顺序、修复密钥权限并移除无用命令:

FROM ubuntu:latest
# 合并apt命令减少镜像层数
RUN apt update && apt install -y openssh-server sudo vim-tiny

RUN useradd -ms /bin/bash -g root -G sudo -u 1000 remote_user
RUN echo 'remote_user:ae******' | chpasswd -c SHA256

RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN bash -c 'install -m755 <(printf "#!/bin/sh\nexit 0") /usr/sbin/policy-rc.d'
RUN ex +'%s/^#\zeListenAddress/\1/g' -scwq /etc/ssh/sshd_config
RUN ex +'%s/^#\zeHostKey .*ssh_host_.*_key/\1/g' -scwq /etc/ssh/sshd_config
RUN RUNLEVEL=1 dpkg-reconfigure openssh-server
RUN ssh-keygen -A -v
# 显式设置ssh目录及密钥文件权限,确保sshd可读取
RUN chmod 700 /etc/ssh && chmod 600 /etc/ssh/ssh_host_*
RUN update-rc.d ssh defaults

RUN ex +"%s/^%sudo.*$/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" -scwq! /etc/sudoers

# 先创建用户ssh目录并设置归属,再切换用户生成密钥
RUN mkdir -p /home/remote_user/.ssh && chown remote_user:root /home/remote_user/.ssh
USER remote_user
RUN ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

验证方式

修改后重新构建镜像并启动容器:

docker-compose down --rmi all
docker-compose up -d
docker logs remote_host

若日志无报错,执行docker ps可看到remote_host容器处于运行状态,此时即可从Jenkins容器尝试SSH连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:41