【发布时间】: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 发生时执行命令或脚本?
【问题讨论】:
-
也许这个问题会对你有所帮助:github.com/traefik/traefik/issues/6993
标签: docker docker-compose traefik