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?
问题原因与解决办法
原因分析
- 第一个Dockerfile的sed命令匹配错误:Ubuntu默认的
sshd_config里,PermitRootLogin的默认值是全小写的prohibit-password,而你的sed命令写的是Prohibit-RootLogin(大小写混合还带连字符),根本匹配不到目标行,自然改不了配置。 - 第二个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
相关产品推荐
相关产品推荐

