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

Ubuntu Docker容器修改sshd_config无效,求助解决方法

问题描述

我正在学习Docker,尝试编写Dockerfile构建包含openssh-server的镜像,实现root用户通过SSH密码登录。编写的第一个Dockerfile如下:

FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install wget openssh-server -y
RUN sed -i 's/PermitRootLogin Prohibit-RootLogin/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN echo 'root:root123' | chpasswd
RUN mkdir /var/run/sshd
CMD ["/usr/sbin/sshd","-D"]
EXPOSE 22

构建镜像无报错,但创建容器后查看/etc/ssh/sshd_config,发现PermitRootLogin仍为prohibit-password,用Putty通过服务器IP和端口登录root(密码root123)被拒绝。

我试过用--no-cache参数构建(怀疑缓存导致sed命令被忽略),也换过Ubuntu基础镜像版本,还写了第二个不使用sed的Dockerfile,通过echo和mv替换配置,同样无效,第二个Dockerfile如下:

FROM ubuntu:16.04
MAINTAINER ananth
RUN apt-get update
RUN apt-get install wget openssh-server -y
RUN echo "PermitRootLogin yes" > /etc/ssh/sshd_config_new
RUN mv /etc/ssh/sshd_config_new /etc/ssh/sshd_config
RUN mkdir /var/run/sshd
CMD ["/usr/sbin/sshd", "-D"]
EXPOSE 22

请问配置为何未修改成功?该如何正确修改sshd_config?

问题原因与解决办法

原因分析

  1. 第一个Dockerfile的sed命令匹配错误:Ubuntu默认的sshd_config里,PermitRootLogin的默认值是全小写的prohibit-password,而你的sed命令写的是Prohibit-RootLogin(大小写混合还带连字符),根本匹配不到目标行,自然改不了配置。
  2. 第二个Dockerfile的配置替换错误:只写一行PermitRootLogin yes就覆盖原配置,会丢掉sshd_config里其他所有必需的配置项,sshd服务加载不到完整配置,要么用默认值要么启动失败,所以还是无法登录。

正确的Dockerfile写法

修正sed的匹配规则,确保能精准找到目标行并修改;同时建议合并RUN命令减少镜像层数,优化构建过程:

FROM ubuntu:20.04
# 安装openssh-server并配置root密码登录
RUN apt-get update && \
    apt-get install -y openssh-server && \
    # 同时处理注释和非注释的PermitRootLogin行
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    # 设置root密码
    echo 'root:root123' | chpasswd && \
    # 创建sshd运行所需目录
    mkdir -p /var/run/sshd && \
    # 清理apt缓存减小镜像体积
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
# 启动sshd服务
CMD ["/usr/sbin/sshd", "-D"]
# 暴露SSH端口
EXPOSE 22

额外注意事项

  • 执行sed时同时处理带注释(#PermitRootLogin prohibit-password)和不带注释的情况,确保不管默认配置是哪种形式都能被正确修改。
  • 把多个RUN命令合并成一个,用&&串联,避免产生过多镜像中间层;最后清理apt缓存,能有效减小镜像大小。
  • 运行容器时需要映射宿主机端口到容器的22端口,比如执行:docker run -d -p 2022:22 <你的镜像名>,之后就能用宿主机IP+2022端口,以root/root123的账号密码登录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:37:50