Я сталкивался с этим вопросом, потому что у нас та же проблема.
Я заметил, что другие ответы предлагали разделить nginx и сервер приложений на две разные службы / модули. Хотя это, безусловно, решение, мне больше нравится автономный Pod с nginx и сервером приложений вместе. Это хорошо работает для нас, особенно с php-fpm, который может использовать сокет unix для связи в одном модуле, что значительно снижает внутреннюю сеть http.
Вот одна идея:
Создайте базовый файл конфигурации nginx, например, proxy.conf
и настройте docker, чтобы добавить его в каталог conf.d
при создании образа. Команда:
ADD proxy.conf /etc/nginx/conf.d/proxy.conf
В proxy.conf
опустите конфигурацию upstream
, оставив ее на потом. Создайте другой файл, run.sh
, и добавьте его к изображению, используя Dockerfile
. Файл может быть следующим:
#!/bin/sh
(echo "upstream theservice { server $UPSTREAM_NAME:$UPSTREAM_PORT; }" && cat /etc/nginx/conf.d/proxy.conf) > proxy.conf.new
mv proxy.conf.new /etc/nginx/conf.d/proxy.conf
nginx -g 'daemon off;'
Наконец, запустите nginx из скрипта run.sh
. Команда Dockerfile
:
CMD /bin/sh run.sh
Хитрость в том, что поскольку контейнер инициализируется таким образом, файл конфигурации не записывается постоянно, и конфигурация обновляется соответствующим образом. Установите соответствующие значения ENV в зависимости от того, используете ли вы из docker-compose или Kubernetes.
Позвольте мне также поделиться менее подходящим решением , которое более хакерно , но также проще ...
В Kubernetes мы изменили образ докера CMD таким образом, чтобы он изменял конфигурацию nginx до запуска контейнера. Мы используем sed
, чтобы обновить имя верхнего уровня до localhost
, чтобы сделать его совместимым с сетью Kubernetes Pod. В нашем случае это выглядит так:
- name: nginx
image: our_custom_nginx:1.14-alpine
command: ["/bin/ash"]
args: ["-c", "sed -i 's/web/127.0.0.1/g' /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]
Хотя этот обходной путь работает, он нарушает принцип неизменной инфраструктуры, поэтому не может быть хорошим кандидатом для всех.