docker: ngnix всегда останавливается, когда CMD выполняется в dockerfile - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь настроить контейнер docker, который одновременно запускает ngnix и nodejs.

Мой dockerfile выглядит следующим образом:

FROM nginx:mainline-alpine
RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.11/main/ nodejs=12.14.0-r0
RUN apk add --no-cache bash
RUN apk add --no-cache nano

ADD ./myHelloWorld /myHelloWorld


CMD ["node", "/myHelloWorld/index.js"]
EXPOSE 3000

База docker image имеет команду для запуска ngnix, но ngnix не запускается после запуска моего контейнера. когда я удаляю строку CMD в моем docker файле, который начинается nodejs. nginx работает как положено.

Я много пробовал, и каждый раз, когда в моем докер-файле есть CMD, ngnix не запускается. я прочитал, что ngnix нужен параметр "-g", "демон выключен"; Но мой базовый образ начинает nginx именно таким образом. https://github.com/nginxinc/docker-nginx/blob/master/stable/alpine/Dockerfile

, если я добавлю

CMD ["nginx", "-g", "daemon off;"]

в конце МОЕГО Dockerfile (что не имеет смысла, потому что это уже часть базового образа) , тогда ngnix работает, но nodejs больше не работает.

Кто-нибудь знает, как запустить оба: ngnix и nodejs?

Буду очень признателен

С уважением, Стефан

Ответы [ 2 ]

1 голос
/ 17 января 2020

Вы не можете иметь несколько CMD инструкций. Вы можете написать сценарий оболочки, который запускает nginx и node и запустить сценарий оболочки как часть инструкции CMD.

Это не рекомендуется, хотя. Как указано в документации:

Как правило, рекомендуется разделять проблемные области, используя одну услугу на контейнер. Эта служба может разделяться на несколько процессов.

. Вы должны запустить ваше приложение nginx и узел в разных контейнерах. Вы можете подключить их, используя общие сети и тома, если это необходимо. Оформить заказ docker-compose, что облегчает запуск нескольких контейнеров. Если вам по-прежнему требуется несколько служб в одном контейнере, лучше использовать диспетчер процессов, например supervisord.

См. - https://docs.docker.com/config/containers/multi-service_container/

0 голосов
/ 17 января 2020

A docker изображение может иметь только один CMD. Если вы включите несколько CMD с, последний из них вступит в силу ( документация ). Dockerfile для базового образа имеет CMD ["nginx", "-g", "daemon off;"], что означает, что он запустится nginx. Когда вы включаете CMD в свой Dockerfile для запуска node, вы перезаписываете исходный CMD, и nginx не будет запускаться по умолчанию.

Вы можете запускать nginx и node отдельно с использованием одного и того же изображения.

docker run MYIMAGE node /myHelloWorld/index.js
docker run MYIMAGE nginx -g "daemon off;"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...