我在这里Dockerfile
找到了这个样本:
// version 1
FROM ubuntu:latest
RUN apt update && apt install ssh -y
RUN service ssh start
CMD ["/usr/sbin/sshd","-D"]
Run Code Online (Sandbox Code Playgroud)
当我构建并运行它时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
Run Code Online (Sandbox Code Playgroud)
然后运行容器:
~$ docker run -p 2222:22 -it ssh_server
Run Code Online (Sandbox Code Playgroud)
并尝试从另一个终端连接它,它不起作用。看来对 sshd 的调用是必要的。另一方面,如果我只是在 Dockerfile 中安装 SSH:
// version 3
FROM ubuntu:latest
RUN apt-get update && apt-get install -y ssh
Run Code Online (Sandbox Code Playgroud)
并像这样运行容器:
~$ docker run -p 2222:22 -it ssh:test
~$ service ssh start
* Starting OpenBSD Secure Shell server sshd
Run Code Online (Sandbox Code Playgroud)
现在我可以连接到容器了。所以我想知道:如果版本 1 中的行RUN ssh service start
是必要的,为什么版本 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"]
Run Code Online (Sandbox Code Playgroud)
它也不起作用。
有人可以解释一下这些行为吗?service ssh start
和之间有什么关系/usr/sbin/sshd
?
好的,现在一切都清楚了:
基本上运行的/usr/sbin/sshd
是 ssh 服务器的运行。它本身无法正常工作的原因(版本 4)是因为您运行时运行的脚本service ssh start
(即脚本)创建了sshd 运行所需的/etc/init.d/ssh
目录。/run/sshd
该脚本还调用可执行文件/usr/sbin/sshd
,但由于这是作为构建的一部分运行的,因此它不会超出构成该层的临时容器。瓦
支撑的是/run/sshd
目录!这就是为什么当我们/usr/sbin/sshd
作为 CMD 运行时它会起作用!
谢谢大家!
归档时间: |
|
查看次数: |
11948 次 |
最近记录: |