Nginx контейнер не использует nginx .conf, если я не перезапущу контейнер - PullRequest
1 голос
/ 09 июля 2020

Как сказано в заголовке, мой nginx контейнер не работает должным образом, пока я не перезапущу его. У меня есть несколько служб, определенных в файле docker-compose.yml, который выглядит следующим образом: reverseproxy - мой nginx контейнер, а service-a и service-b - Node.js серверы.

version: "3.4"
services:
  reverseproxy:
    container_name: reverseproxy
    build:
      context: ./proxy
    ports:
      - "80:80"
  service-a:
    container_name: service-a
    build:
      context: ./service-a
    ports:
      - "3500:3500"
    command: ["yarn", "run", "watch-debug"]
  service-b:
    container_name: service-b
    build:
      context: ./service-b
    ports:
      - "3501:3501"
    command: ["yarn", "run", "watch-debug"]

Dockerfile, используемый для создания моей службы reverseproxy, просто удаляет файл default.conf, а затем копирует файл nginx.conf с моего хоста в образ:

FROM nginx:alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf

И мой nginx.conf файл, который получает скопированный в изображение выглядит так:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    server {
        listen 80;

        location /api/customers {
            proxy_pass         http://service-a:3500;
            proxy_redirect     off;
            proxy_set_header   Host $http_host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }

        location /api/products {
            proxy_pass         http://service-b:3501;
            proxy_redirect     off;
            proxy_set_header   Host $http_host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}

Когда я docker-compose up все работает нормально, но когда я отправляю POST на одну из своих конечных точек (например, localhost: 80 / api / customers), тогда nginx отвечает 502. Но если я docker container stop reverseproxy, а затем docker container start reverseproxy, тогда все работает, как ожидалось, и я могу подключиться к своим конечным точкам с помощью localhost: 80.

Мне удалось docker exec -it reverseproxy /bin/sh и смог убедиться, что default.conf пропало, а nginx.conf было скопировано с моего хоста, как и ожидалось. Я следил за образцом конфигурации со страницы nginx на Docker Hub, и большинство онлайн-руководств демонстрируют почти идентичную настройку.

Что может быть причиной этого? Как сделать так, чтобы моя служба nginx Revereproxy работала должным образом без перезапуска контейнера?

Изменить: я использую Postman для выполнения своих запросов localhost: 80

1 Ответ

1 голос
/ 10 июля 2020

@ DavidMaze нашел правильное решение - спасибо!

  reverseproxy:
    container_name: reverseproxy
    build:
      context: ./proxy
    ports:
      - "80:80"
    depends_on:
      - "service-a"
      - "service-b"

Имеет смысл, что он работает должным образом только при перезапуске, потому что к тому времени другие службы были доступны. Просто попробовал, и все работает как положено.

...