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.
相关环境信息:
- 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/
- 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/
- 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"]
问题原因与修复方案
核心问题
- 生成SSH主机密钥后未确保权限正确,容器启动时以
remote_user身份运行的sshd进程无法读取/etc/ssh/下的主机密钥文件。 RUN service ssh start属于无用命令——镜像构建阶段启动的进程会在构建完成后终止,不会延续到容器运行阶段。- 用户切换时机过早,导致后续主机密钥权限配置无法以
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
相关产品推荐
相关产品推荐

