nginx не запускается в Docker, если только вручную не запустить его и не запустить

nginx не запускается в Docker, если только вручную не запустить его и не запустить

Я довольно новичок в Docker. Мне нужно создать файл Docker, который запустит сервер Node Express и Nginx в качестве обратного прокси-сервера. Но проблема в том, что сервер Node запускается, а Nginx не запускается. Когда я вручную запускаю контейнер и запускаю его, вводя «nginx», а затем нажимая Enter, он запускается, и контейнер прослушивает порт 80, и Nginx работает таким образом. Но я хочу, чтобы он запускался сразу после запуска контейнера.

Вот мой Dockerfile:

FROM alpine
RUN apk add --update nodejs nodejs-npm
RUN apk add nginx
WORKDIR /usr/
COPY package*.json ./
RUN npm install
COPY . .
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
RUN nginx #<-- this does not work!!
CMD npm run start
EXPOSE 80

Это API-сервер, прослушивающий порт 8080, поэтому Nginx будет выполнять обратный прокси-сервер и предоставлять его внешнему миру на порт 80. Я могу добиться этого, запустив 2 контейнера: один для Nginx и один для nodejs, используя docker-compose, но я хочу запустить оба в одном контейнере.

решение1

Прочитав ваш вопрос еще раз, я задаюсь вопросом, зачем вам вообще нужен обратный прокси? Вам следует пропатчить свое приложение node, чтобы оно само обслуживало порт 80.

Идея контейнера Docker в любом случае заключается в следующем: "Один контейнер, один процесс". Эта парадигма часто игнорируется, но вам не следует обслуживать обратный прокси в контейнере, который сам по себе может служить веб-сервером.

решение2

Нам нужно разделить процессы node JS и nginx на отдельные контейнеры. Они оба могут находиться в одной сети и общаться друг с другом, контейнеры общаются друг с другом по имени. Вы можете получить пакет на обратном прокси-сервере nginx, а затем переслать его в приложение nodeJS. В приложении nodeJS ваш npm запускается с основным процессом, а в приложении nginx ваш демон службы nginx должен быть основным процессом. Контейнер всегда активен до тех пор, пока основной процесс не будет запущен и запущен, поэтому в мировом контейнере мы разделяем каждую из отдельных функций и развертываем их как контейнеры. В вашем случае приложение nodeJS должно быть отдельным контейнером, а nginx должен быть отдельным контейнером. Только для контейнера nginx вы будете предоставлять порт для внешнего подключения.

Связанный контент