我使用 Dockerfile 配置了 CentOS,我打算利用 CMD ["/usr/sbin/sshd", "-D"] 使 SSH 服务在每次容器启动时自动启动。但是,在我执行 docker run 后,它卡住了。 这是我的 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
我尝试删除 Dockerfile 中的这一行并在容器内手动执行 /usr/sbin/sshd -d 命令,没有发现任何问题。
使用与 CentOS / Red Hat Enterprise Linux 不兼容的某些配置运行 SSH 服务器(sshd)时会发生此错误,这里是
UsePAM no
指令。解决方法是在运行 sshd
之前在 Dockerfile 中添加一个步骤,以在 /etc/ssh/sshd_config
文件中注释此指令。
示例:
# 每次开机自启动sshd都会卡死,为什么?
RUN sed -i 's/^UsePAM no$/#UsePAM no/g' /etc/ssh/sshd_config
CMD ["/usr/sbin/sshd", "-D"]