docker 容器无法使用 `service sshd restart`

docker container can't use `service sshd restart`

我正在尝试构建一个 hadoop Dockerfile

在构建过程中,我添加了:

  && apt install -y openssh-client \
  && apt install -y openssh-server \
  && ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa \
  && cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys \
  && chmod 0600 ~/.ssh/authorized_keys
  && sed -i '/\#AuthorizedKeysFile/ d' /etc/ssh/sshd_config \
  && echo "AuthorizedKeysFile ~/.ssh/authorized_keys" >> /etc/ssh/sshd_config \
  && /etc/init.d/ssh restart

我假设当我 运行 这个容器时:

docker run -it --rm hadoop/tag bash

我将能够:

ssh localhost

但是我得到一个错误:

ssh: connect to host localhost port 22: Connection refused

如果我 运行 在容器内手动执行此操作:

/etc/init.d/ssh restart
# or this
service ssh restart

然后我就可以连接了。我认为这意味着 sshd 重新启动没有工作

我在 Dockerfile 中使用 FROM java

构建过程只构建一个图像。当时 运行 的进程(使用 RUN)在构建后不再 运行ning,并且在使用图像启动容器时不会再次启动。

您需要做的是让 sshd 在容器运行时间启动。最简单的方法是使用入口点脚本。

Dockerfile:

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
CMD ["whatever", "your", "command", "is"]

entrypoint.sh:

#!/bin/sh

# Start the ssh server
/etc/init.d/ssh restart

# Execute the CMD
exec "$@"

使用上面的方法重建镜像,当你用它来启动容器时,它应该在 运行 启动你的 CMD.

之前启动 sshd

如果您愿意,您也可以将开始使用的基本图像更改为 Phusion baseimage 之类的图像。它可以轻松启动一些服务,如 syslogd、sshd,您可能希望容器具有 运行ning.