Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行我的应用程序容器时自动启动和公开ssh的正确方法_Ssh_Docker - Fatal编程技术网

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

运行我的应用程序容器时自动启动和公开ssh的正确方法,ssh,docker,Ssh,Docker,我有带有python应用程序的容器,我需要它们在运行它们时自动启动并公开ssh。我知道,但是现在。我想知道在docker容器中自动运行附加服务的最佳方法 由于Docker只启动一个进程,安装sshd是不够的。处理这一问题显然有多种选择: 使用流程管理器,如Monit或Supervisor 使用该选项 在/etc/bash.bashrc末尾追加一个命令(服务sshd start)(例如,请参阅) 在我看来,选择1似乎太过分了。另外,我想我必须用cmd运行容器来调用流程管理器,而不是bash或我的p

我有带有python应用程序的容器,我需要它们在运行它们时自动启动并公开ssh。我知道,但是现在。我想知道在docker容器中自动运行附加服务的最佳方法

由于Docker只启动一个进程,安装
sshd
是不够的。处理这一问题显然有多种选择:

  • 使用流程管理器,如Monit或Supervisor
  • 使用该选项
  • /etc/bash.bashrc
    末尾追加一个命令(
    服务sshd start
    )(例如,请参阅)
  • 在我看来,选择1似乎太过分了。另外,我想我必须用cmd运行容器来调用流程管理器,而不是bash或我的python应用程序:这不是我想要的

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

    选项3非常简单,但相当脏。此外,如果我使用
    /bin/bash
    以外的另一个命令运行容器,它也不会工作


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

    您提到选项1似乎有些过分。为什么这样做太过分了?Supervisor的配置非常简单,基本上可以做您想做的事情

    首先,编写启动python应用程序和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
    ,并将其提交到repo中的某个位置。在
    Dockerfile
    中,将该文件作为容器构建步骤之一复制到容器中,公开SSH和应用程序的端口(如果需要),并将CMD设置为启动SupervisorORD:

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

    这是干净和容易理解的。这就是我在需要时在一个容器中运行多个进程的方式。这甚至是一个很好的解决方案。

    如果您不想使用process manager,您可以将实际的容器命令封装在shell脚本中,然后使用sudo服务ssh start执行实际的命令

    sudo服务ssh启动
    python myapp.py-x args诸如此类


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

    是的,我们可以为容器中的多进程配置Supervisord。如果您想使用Openssh服务器,我们可以如下所示配置管理器-:

    [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"]
    

    参考链接-:

    “过度杀伤力”仅仅是因为我认为我可以想出更简单的方法。但这显然是目前最流行的解决方案:谢谢您提供的详细信息!另外,您可以使用以下命令从容器外部停止python应用程序:
    docker exec-i-t supervisorctl stop pythonapp',并且可以使用
    start'启动它。如果应用程序以其他方式被终止,主管将重新启动它。您可以通过使用'kill'关闭python应用程序来测试这一点,并看到它会回来。