【问题标题】:Start docker container on incoming HTTP request在传入的 HTTP 请求上启动 docker 容器
【发布时间】:2018-10-17 06:38:48
【问题描述】:

我有一台服务器在单独的 docker 容器中运行多个 Web 应用程序。我使用Traefik 作为反向代理。因此,每当容器空闲 15 分钟时,我都会从内部停止容器(结束导致容器停止的正在运行的进程)。如何按需重启容器,即当有对已停止容器的传入请求时?

如被问及,我没有使用任何集群管理器或类似的东西。基本上,我有一个 API 服务器,它使用 docker-py 库来创建图像和容器。 Traefik 监听 docker 事件并在创建容器时生成配置以将 URL 路由到相应的容器。

我尝试了 systemd 套接字激活。这是套接字和服务文件。

app.socket

[Unit]
Description=App Socket

[Socket]
ListenStream=3000
Accept=yes

[Install]
WantedBy=sockets.target

app@.service

[Unit]
Description=App Service
Requires=app.socket

[Service]
Type=simple
ExecStart=/usr/bin/npm start --prefix /path/to/dir
StandardInput=socket
StandardError=journal
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

这是我目前的方法。我的容器正在运行节点应用程序。所以,我结束了容器内的节点进程。在结束节点进程时,我将启用并启动 app.socket。当 3000 端口有传入流量时,我的应用程序将通过套接字激活来启动。

但是当我尝试访问该端口时没有任何反应。我已经确认套接字激活正在工作。当我执行命令date | netcat 127.0.0.1 3000 时,应用程序似乎启动然后立即停止,没有任何错误。

也许套接字激活无法按我的预期工作。在启用 app.socket 后,我可以看到一个进程 init 和 PID 1 正在端口 3000 上运行。一旦流量进入端口 3000,我想在容器内启动我的节点应用程序。但是,如果该端口上已经有一个进程在运行,那么应用程序如何在 3000 上启动呢?

也许有一些方法可以使用 Traefik,因为它是我正在使用的反向代理。是否有一些功能可以让我在 404 发生时执行命令或脚本?

【问题讨论】:

标签: docker docker-compose traefik


【解决方案1】:

如果您能说出您是如何管理 docker 容器(k8 或 swarm 或其他任何东西)的,那将会更有帮助。但根据您的初始输入,我猜您正在寻找 Inetd 或 systemd 套接字激活。这篇文章可能会有所帮助https://www.reddit.com/r/docker/comments/72sdyf/startrun_a_container_when_incoming_traffic/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    相关资源
    最近更新 更多