Запускать докер-контейнер при входящем HTTP-запросе

У меня есть сервер, на котором запущено несколько веб-приложений в отдельных контейнерах докеров. Я использую 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?

Возможно, вам поможет этот вопрос: github.com/traefik/traefik/issues/6993

Gogowitsch 23.01.2021 19:34
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
4
1
1 917
1

Ответы 1

Было бы более полезно, если бы вы могли сказать, как вы управляете своими контейнерами докеров (k8 или swarm или что-то еще). Но исходя из вашего первоначального ввода, я думаю, вы ищете активацию сокета Inetd или systemd. Этот пост может быть полезным https://www.reddit.com/r/docker/comments/72sdyf/startrun_a_container_when_incoming_traffic/

Другие вопросы по теме