利用centos__sshd使用docker run命令输出报错
时间: 2025-06-23 22:24:39 浏览: 24
### 解决 CentOS 上 `docker run` 命令与 SSHD 相关的报错
当在 CentOS 中使用 Docker 运行带有 SSH 服务的容器时,可能会遇到各种错误。常见的原因包括缺少必要的依赖包、配置不正确以及权限问题。
#### 错误分析
通常情况下,在基于 CentOS 的 Docker 容器内启动 SSH 服务会因为缺乏某些初始化操作而失败。具体来说:
- 如果尝试通过 `systemctl start sshd` 来启动 SSH 服务,则会出现如下错误:“System has not been booted with systemd as init system (PID 1). Can't operate.”这是因为 Docker 容器默认并不支持完整的 Systemd 功能[^1]。
为了成功创建能够正常工作的 SSH 服务器容器,建议按照下面的方法修改 Dockerfile 和相应的脚本。
#### 修改 Dockerfile 文件
对于想要安装 OpenSSH 并设置其自动启动的情况,应该调整 Dockerfile 如下所示:
```dockerfile
FROM centos:8
# 更新软件源并安装openssh-server及相关工具
RUN yum update -y && \
yum install -y openssh-server openssh-clients which sudo procps-ng iproute lsof net-tools strace tcpdump vim-minimal man-pages less curl wget tar gzip bzip2 xz psmisc rsync cronie rsyslog policycoreutils-python-utils setools-console selinux-policy-targeted libselinux-utils audit bash-completion bind-utils hostname unzip zip git nano htop iotop iftop nmap nc telnet traceroute mtr fping dnsutils iptables-services firewalld
# 创建所需的目录结构和环境变量
RUN mkdir /var/run/sshd && \
echo 'root:screencast' | chpasswd && \
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# 设置无密码登录(可选)
RUN sed -ri 's/^#?PasswordAuthentication\s+.*/PasswordAuthentication no/g' /etc/ssh/sshd_config
# 开启转发端口功能
RUN sed -ri 's/^#?GatewayPorts\s+.*/GatewayPorts yes/g' /etc/ssh/sshd_config
# 替换原有的entrypoint.sh 或者添加新的入口脚本来代替systemctl命令来管理sshd进程
COPY entrypoint.sh /
RUN chmod +x /entrypoint.sh
EXPOSE 22
CMD ["/entrypoint.sh"]
```
这里的关键在于最后两行指定了一个新的入口点 `/entrypoint.sh` 而不是直接调用 `systemctl start sshd` 。这允许我们绕过无法使用的 Systemd 系统。
#### 编写自定义 Shell Script (`entrypoint.sh`)
接下来编写一个简单的 shell script 来替代原本由 Systemd 处理的服务控制逻辑:
```bash
#!/bin/sh
service sshd start
exec "$@"
```
此脚本的作用是在容器启动时手动激活 SSH 服务,并继续执行任何传递给它的参数。
#### 构建镜像
完成上述更改之后就可以构建自己的定制化镜像了:
```shell
$ docker build -t my-custom-centos-with-sshd .
```
这样就解决了由于试图在非 Systemd 支持环境下运行 `systemctl` 所带来的兼容性问题[^3]。
阅读全文
相关推荐



