Запустить Docker-контейнер при входящем HTTP-запросе. - PullRequest
0 голосов
/ 17 октября 2018

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

1 Ответ

0 голосов
/ 17 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...