linux - 在 Docker 容器中运行 sshd
问题描述
我在这里Dockerfile
找到了这个样本:
// 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
?
解决方案
好的,现在一切都清楚了:
基本上运行/usr/sbin/sshd
就是运行 ssh 服务器。它无法自行解决(版本 4)的原因是因为运行时运行service ssh start
的脚本(即脚本/etc/init.d/ssh
)创建了/run/sshd
运行 sshd 所需的目录。
该脚本还调用了可执行文件/usr/sbin/sshd
,但由于这是作为构建的一部分运行的,因此它无法在构成该层的临时容器之外维持。W
支撑的是/run/sshd
目录!这就是为什么当我们/usr/sbin/sshd
作为 CMD 运行时它可以工作!
谢谢大家!
推荐阅读
- mongodb - MongoDB 在对象数组中查询
- angular - Agora RTM Web SDK 在使用 Angular Server Side Rendering (SSR) 构建后抛出错误
- javascript - 滚动上的粘性标题问题
- javascript - Kata 答案类似于测试答案,但测试失败
- reactjs - 某些反应路线中未显示图像
- amazon-web-services - boto3 通过元数据或标签查找对象
- git - gitlab 管道遇到“外部:失败”错误
- python - 使用几个 QAction 像单选按钮
- java - 实现查询结果更改通知的数据库通用方式
- javascript - 切换按钮在主页以外的其他文件中不起作用