正确的方法来运行我的应用程序容器时自动启动和公开ssh

我有容器与python应用程序,我需要他们自动启动和暴露ssh运行时。 我知道这是对付Docker的最佳做法 ,但现在我没有任何其他解决scheme 。 我很想知道在Docker容器中自动运行一个附加服务的最佳方法。

由于Docker只会启动一个进程,安装sshd是不够的。 显然有多种select来处理它:

  1. 使用像Monit或Supervisor这样的进程pipe理器
  2. 使用ENTRYPOINT选项
  3. /etc/bash.bashrc末尾添加一个命令(例如service sshd start )(请参阅此答案 )

选项1似乎对我来说过分了。 另外我想我将不得不运行一个cmd调用进程pipe理器而不是bash或我的python应用程序的容器:不完全是我想要的。

我不知道如何使用选项2这种情况。 我应该写一个自定义脚本启动sshd,然后运行提供的命令,如果有的话? 这个脚本应该怎么样?

选项3非常简单,但很脏。 另外,如果我用另一个命令而不是/bin/bash运行容器,它将不起作用。

什么是最好的解决scheme,以及如何设置它?

你提到的选项1似乎是矫枉过正。 为什么它是矫枉过正? 主pipe是非常简单的configuration,并将基本上做你想要的。

首先,编写启动你的python应用程序和sshd的主pipeconfiguration文件:

 [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D [program:pythonapp] command=/path/to/python myapp.py -x args etc etc 

调用supervisord.conf文件并将其提交到您的仓库中。 在您的Dockerfile ,将该文件作为容器构build步骤之一复制到容器中,公开SSH和您的应用程序的端口(如果需要),并将CMD设置为启动supervisord:

 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf EXPOSE 22 80 CMD ["/usr/bin/supervisord"] 

这是干净和容易理解的。 这是我如何在需要时在容器中运行多个进程。 甚至在Docker文档中提出这是一个很好的解决scheme。

如果你不想使用进程pipe理器,你可以将你的实际容器命令包装在一个shell脚本中,然后执行sudo service ssh start,然后执行你的实际命令。

sudo服务ssh启动
pythonmyapp.py -x参数等等等等

这将启动ssh作为一个守护进程,然后你的python应用程序将启动后。

是的,我们可以在一个容器中为多进程configurationSupervisord。 如果你想使用Openssh-server,我们可以像下面这样configurationSupervisor:

 [supervisord] nodaemon=true [program:sshd] command=/usr/sbin/sshd -D 

在supervisord.conf文件中。

我们可以在docker image中添加supervisord.conf文件,在Dockerfile中更新一行。

 RUN apt update && apt install -y supervisor openssh-server COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf EXPOSE 22 CMD ["/usr/bin/supervisord"] 

参考链接: Gotechnies