У меня есть сервер, на котором запущено несколько веб-приложений в отдельных контейнерах докеров.Я использую Traefik в качестве обратного прокси.Таким образом, всякий раз, когда контейнер простаивает, скажем, 15 минут, я останавливаю контейнер изнутри (заканчиваю рабочий процесс, который вызывает остановку контейнера).Как я могу перезапустить контейнер по требованию, т. Е. При поступлении входящего запроса на остановленный контейнер?
Как я и просил, я не использую какой-либо диспетчер кластеров или что-то подобное.По сути, у меня есть сервер API, который использует библиотеку docker-py для создания изображений и контейнеров.Traefik прослушивает события докера и генерирует конфигурацию всякий раз, когда создается контейнер для маршрутизации 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
, приложение запускается и сразу же останавливается без ошибок.
Возможно, активация сокета не работает так, как я этого ожидаю.Я вижу, что процесс init
с PID 1
работает на порту 3000 после включения app.socket .Как только трафик поступит на порт 3000, я хочу запустить приложение узла внутри контейнера.Но как запустить приложение на 3000, если на этом порту уже запущен процесс?
Возможно, есть какой-то способ сделать это с Traefik , поскольку я использую обратный прокси-сервер,Есть ли какая-то функциональность, которая позволяет мне выполнять команду или скрипт всякий раз, когда происходит 404?