Ответ от автора
TL: DR
В Stackoverflow есть довольно похожий вопрос, который помогает решить мою проблему:
Проблема заключалась в том, что Docker ENTRYPOINT
или CMD
должен "порождать один процесс".И я положил запуск Redis и выполнение узла init.js
как разные программы в supervisord
.Предоставив supervisord.conf
, например:
[supervisord]
nodaemon=true
loglevel=debug
[program:redis]
priority=1
command=redis-server
[program:configurations]
priority=2
command=/bin/sh -c /app/tasks/redis/entrypoint.sh
Почему я это сделал?
Основная проблема, с которой я столкнулся, заключалась в неправильном понимании того, что на самом деле являетсяДокер контейнер.А что значит ENTRYPOINT
или CMD
в Docker.Я подумал, что мне нужно просто «запустить какой-нибудь сервер в Docker и открыть какой-нибудь порт, а Docker все сделает сам» , но это не тот способ, которым работают контейнеры.Существует разница между контейнерами и виртуальными машинами.Посмотрите на это: Чем Docker отличается от виртуальной машины?
Когда вы думаете о контейнере Docker как обертке над одним процессом, кажется ясным, что код, написанный на моем Dockerfile
, не будет работатьтак, как я ожидал.
Если необходимо выполнить несколько процессов в контейнере Docker, вам следует использовать что-то вроде supervisord
или concurrently
(если вы предпочитаете Node
экосистему).