我有使用python应用程序的容器,我需要它们在运行时自动启动并公开ssh。我知道it's against Docker's best practices,但现在I don't have any other solution。我有兴趣知道在docker容器中自动运行附加服务的最佳方法。
由于Docker只会启动一个进程,因此安装sshd
还不够。显然有多种选择来处理它:
ENTRYPOINT
选项service sshd start
末尾添加一个命令(例如/etc/bash.bashrc
(参见this answer)选项1 对我来说似乎有些过分。此外,我想我必须使用cmd运行容器,调用进程管理器而不是bash或我的python应用程序:不完全是我想要的。
我不知道如何在这种情况下使用选项2 。我应该编写一个启动sshd的自定义脚本,然后运行提供的命令吗?这个脚本应该怎么样?
选项3 非常简单但很脏。如果我使用除/bin/bash
以外的其他命令运行容器,它也不会工作。
什么是最佳解决方案以及如何设置?
答案 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