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


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