openssh-server 未在 Docker 容器中启动

openssh-server 未在 Docker 容器中启动

我有一个奇怪的问题。

我无法 ssh 到具有 ip 地址的 docker 容器172.17.0.61

我收到以下错误:

$ ssh 172.17.0.61
ssh: connect to host 172.17.0.61 port 22: Connection refused

我的Dockerfile确实包含openssh-server安装步骤:

RUN apt-get -y install curl runit openssh-server

还有启动 ssh 的步骤:

RUN service ssh start

可能是什么问题?

当我使用进入容器时nsenter并启动ssh服务,然后我就可以 ssh 了。但是创建容器时ssh-server似乎没有启动。

我应该怎么办?

答案1

容器与镜像

RUN语句用于在构建 docker 镜像时运行命令。
使用ENTRYPOINT和 ,CMD您可以定义使用该映像启动容器时要运行的内容。
Dockerfile 参考了解如何使用它们的说明。

服务

容器中没有预装init-system,所以不能service ... start在容器中使用。
考虑将语句中的进程CMD作为前台进程启动,或者使用像 Phusion 或 Supervisord 这样的 init 系统。

答案2

我认为有一个更好的方法:

Dockerfile

FROM ubuntu:14.04.1
EXPOSE 22
COPY docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
RUN apt-get install -y openssh-server

ENTRYPOINT ["sh", "/docker-entrypoint.sh"]

# THIS PART WILL BE REPLACED IF YOU PASS SOME OTHER COMMAND TO docker RUN
CMD while true; do echo "default arg" && sleep 1; done

docker-entrypoint.sh

#!/bin/bash
service ssh restart
exec "$@"

构建命令 docker build -t sshtest .

这种方法的好处是,当您使用 时,您的 ssh 守护进程将始终启动docker run,但您也可以指定可选参数,例如:

docker run sshtestdefault arg每1秒打印一次是否每3秒docker run sshtest sh -c 'while true; do echo "passed arg" && sleep 3; done'打印一次passed arg

相关内容