【发布时间】:2020-12-21 03:43:52
【问题描述】:
我找到了这个Dockerfile 示例here:
// version 1
FROM ubuntu:latest
RUN apt update && apt install ssh -y
RUN service ssh start
CMD ["/usr/sbin/sshd","-D"]
当我构建并运行这个 Dockerfile 时,它会在前台运行一个 SSH 服务器,这很棒。
如果我使用以下Dockerfile:
// version 2
FROM ubuntu:latest
RUN apt update && apt install ssh -y
RUN service ssh start
# CMD ["/usr/sbin/sshd","-D"] // without this line
然后运行容器:
~$ docker run -p 2222:22 -it ssh_server
并尝试从另一个终端连接到它,它不起作用。看起来这个对 sshd 的调用是必要的。另一方面,如果我只是在 Dockerfile 中安装 SSH:
// version 3
FROM ubuntu:latest
RUN apt-get update && apt-get install -y ssh
然后像这样运行容器:
~$ docker run -p 2222:22 -it ssh:test
~$ service ssh start
* Starting OpenBSD Secure Shell server sshd
现在我可以连接到容器了。所以我想知道:如果行RUN ssh service start
第 1 版是必须的,为什么第 3 版不需要?
如果我构建并运行第 4 版,则更加混乱:
// version 4
FROM ubuntu:latest
RUN apt update && apt install ssh -y
#RUN service ssh start // without this line
CMD ["/usr/sbin/sshd","-D"]
它也不起作用。
有人可以解释这些行为吗? service ssh start和/usr/sbin/sshd是什么关系?
【问题讨论】:
-
为什么要在容器中运行 sshd?它闻起来像anti-pattern。我建议不要将容器视为虚拟机。如果你想闯入一个正在运行的容器,最好使用
docker exec。 -
RUN是仅在构建时执行的步骤,而不是在您实际运行容器时执行的步骤。此外,当运行 Ubuntu 容器时,它只会启动其中的单个 CMD 进程,init/systemd 将不会运行。 -
RUN命令实际上是一个完全的空操作。