Назад | Перейти на главную страницу

Не удается заставить образ Nginx работать внутри контейнера Docker

Я не могу понять, в чем проблема с официальным образом nginx для докера. Я использую его в файле docker-compose.yml, как указано на официальной странице изображения:

web:
image: nginx
volumes:
  - ./custom-nginx.conf:/etc/nginx/conf.d/custom-nginx.conf
ports:
  - "80:80"
environment:
  - NGINX_HOST=mysite.com
  - NGINX_PORT=80
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

Файл custom-nginx.conf выглядит так:

upstream app_server {
    server 127.0.0.1:7999;
}

server {
listen ${NGINX_PORT};
server_name ${NGINX_HOST};
root /var/www/app/;
gzip_static always;

access_log    /var/log/nginx/app.access.log;
error_log     /var/log/nginx/app.error.log;

client_max_body_size 5000M;
proxy_connect_timeout 6000;
proxy_send_timeout    6000;
proxy_read_timeout    6000;
send_timeout          6000;

location / {
    # checks for static file, if not found proxy to app
    try_files $uri @proxy_to_app;
}

location @proxy_to_app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;

    # we don't want nginx trying to do something clever with
    # redirects, we set the Host: header above already.
    proxy_redirect off;
    proxy_pass http://app_server;
}
location /media/ {
    internal;
    error_page 401 403 404 = @proxy_to_app;
}
location /favicon.ico {
    alias ../static/favicon.ico;
}
}

Но соответствующий док-контейнер просто закрывается при запуске, заявляя о всевозможных ошибках конфигурации, которые заменяют друг друга в произвольном и неясном порядке, несмотря на мои правки. Ошибки, такие как дублирование восходящего потока, недопустимое количество аргументов в try_files, отсутствующие переменные env и т. д. Я нашел несколько источников в Интернете, описывающих аналогичную проблему, но то, что там предлагается, не сработало для меня. Я попытался удалить объявление восходящего потока в настраиваемом файле конфигурации nginx, попытался указать точный env. переменная для замены в команде docker-compose для изображения nginx, например $$NGINX_HOST и \$NGINX_HOST - никакого эффекта, только одна ошибка вместо другой. Итак, как заставить контейнер nginx правильно работать с docker-compose.yml и файлами конфигурации, которые я предоставил?

PS: docker logs -t cont_id дает ту же ошибку: nginx: [emerg] недопустимое количество аргументов в директиве try_files в /etc/nginx/conf.d/default.conf

Если кто-то сталкивается с подобной проблемой, я обнаружил, что это связано с переопределением переменных среды здесь command: /bin/sh -c "envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'". Это то, что другие люди писали в сети, но все их предложения не сработали для меня. В итоге я удалил эту часть envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf && и environment: раздел в docker-compose.yml, хост и порт жесткого кодирования. Это позволило запустить nginx. Тогда у меня была ошибка:

upstream app_server {
    server 127.0.0.1:7999;
}

Это должно быть имя адреса контейнера приложения в сети докеров.