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

Docker中配置CentOS容器启动sshd服务卡死问题求助

CentOS 7.9容器启动SSH服务卡死问题排查与解决

我通过Dockerfile配置CentOS 7.9.2009容器,期望用CMD ["/usr/sbin/sshd", "-D"]实现容器启动时自动开启SSH服务,但执行docker run后容器出现卡死情况。移除该CMD指令后,进入容器手动执行/usr/sbin/sshd -d却能正常运行。

原Dockerfile内容

FROM centos:7.9.2009
 
# 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no  
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
#安装openssh-clients
RUN yum install -y openssh-clients
#安装epel-release
RUN yum install -y epel-release
#安装net-tools
RUN yum install -y net-tools
#安装vim
RUN yum install -y vim


# 添加测试用户root,设置密码,并且将此用户添加到sudoers里  
RUN echo "root:310013" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t ed25519 -b 256 -f /etc/ssh/ssh_host_ed25519_key

# 启动sshd服务并且暴露22端口  
RUN mkdir /var/run/sshd
EXPOSE 22

# 每次开机自启动sshd都会卡死,为什么?
CMD ["/usr/sbin/sshd", "-D"]

ADD jdk-8u401-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_401 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-3.3.6-src.tar.gz /usr/local
RUN mv /usr/local/hadoop-3.3.6-src /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

问题原因与解决方案

1. 核心问题分析

容器看似“卡死”主要有两个可能:一是sshd -D前台运行时无日志输出,导致前台启动的容器视觉上停滞;二是Dockerfile指令顺序不符合最佳实践,引发潜在的环境或配置冲突。

2. 排查与修复步骤

(1)确认容器真实状态

先以后台模式启动容器,避免无输出导致的视觉误解:

docker run -d -p 2222:22 <你的镜像标签>

查看容器是否正常运行:

docker ps

若容器在运行,查看sshd日志定位具体问题:

docker logs <容器ID>

(2)调整CMD指令位置

将CMD移至所有构建指令的最后,这是Dockerfile编写的最佳实践,确保镜像构建完成后再定义启动命令:

# ... 所有ADD、RUN、ENV指令之后 ...
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

(3)修复sshd配置与权限

  • 确保允许root密码登录,修改sshd配置:
    sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config
    
  • 确认ssh密钥与运行目录的权限符合要求:
    chmod 755 /var/run/sshd
    chmod 600 /etc/ssh/ssh_host_*_key
    chmod 644 /etc/ssh/ssh_host_*.pub
    

(4)优化Dockerfile减少镜像层数

合并冗余的RUN指令,清理yum缓存,减少镜像体积并提升构建效率:

RUN yum install -y openssh-server sudo openssh-clients epel-release net-tools vim && \
    yum clean all && rm -rf /var/cache/yum

修正后的完整Dockerfile

FROM centos:7.9.2009
 
# 安装基础工具并清理缓存
RUN yum install -y openssh-server sudo openssh-clients epel-release net-tools vim && \
    yum clean all && rm -rf /var/cache/yum

# 修改sshd核心配置
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && \
    sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config

# 配置root用户与ssh密钥(无交互生成)
RUN echo "root:310013" | chpasswd && \
    echo "root   ALL=(ALL)       ALL" >> /etc/sudoers && \
    ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" && \
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" && \
    ssh-keygen -t ecdsa -b 256 -f /etc/ssh/ssh_host_ecdsa_key -N "" && \
    ssh-keygen -t ed25519 -b 256 -f /etc/ssh/ssh_host_ed25519_key -N ""

# 创建sshd运行目录并设置权限
RUN mkdir /var/run/sshd && chmod 755 /var/run/sshd

# 安装JDK并配置环境变量
ADD jdk-8u401-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_401 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

# 安装Hadoop并配置环境变量
ADD hadoop-3.3.6-src.tar.gz /usr/local
RUN mv /usr/local/hadoop-3.3.6-src /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

# 暴露端口与定义启动命令
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

内容的提问来源于stack exchange,提问作者刘茂林

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:04:57