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

时间:2015-02-25 11:26:25

标签: ssh docker

我有使用python应用程序的容器,我需要它们在运行时自动启动并公开ssh。我知道it's against Docker's best practices,但现在I don't have any other solution。我有兴趣知道在docker容器中自动运行附加服务的最佳方法。

由于Docker只会启动一个进程,因此安装sshd还不够。显然有多种选择来处理它:

  1. 使用Monit或Supervisor等流程管理器
  2. 使用ENTRYPOINT选项
  3. service sshd start末尾添加一个命令(例如/etc/bash.bashrc(参见this answer
  4. 选项1 对我来说似乎有些过分。此外,我想我必须使用cmd运行容器,调用进程管理器而不是bash或我的python应用程序:不完全是我想要的。

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

    选项3 非常简单但很脏。如果我使用除/bin/bash以外的其他命令运行容器,它也不会工作。

    什么是最佳解决方案以及如何设置?

3 个答案:

答案 0 :(得分:4)

你提到选项1似乎有点矫枉过正。为什么过度杀伤? Supervisor配置非常简单,基本上可以满足您的需求。

首先,编写启动python app和sshd的超级用户配置文件:

[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中,将该文件作为容器构建步骤之一复制到容器中,公开SSH和您的应用程序的端口(如果需要),并将CMD设置为启动supervisord:

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

这很简洁易懂。这是我在需要时在容器中运行多个进程的方式。它甚至可以suggested in the Docker docs作为一个很好的解决方案。

答案 1 :(得分:1)

如果您不想使用进程管理器,可以将实际容器命令包装在shell脚本和sudo服务ssh start中,然后执行实际命令。

sudo service ssh start
python myapp.py -x args blah blah

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

答案 2 :(得分:0)

是的,我们可以在容器中为多进程配置Supervisord。如果您想使用Openssh-server,我们可以像下面那样配置Supervisor - :

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D
在supervisord.conf文件中

我们可以在docker镜像中添加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