Подписаться на блог

Docker + Nginx + Env

Иногда бывают ситуации, когда внутри nginx-конфига надо сделать что-то в зависимости от переменной окружения, которая прокинется откуда-то извне (или не прокинется), так помимо этого это всё ещё и в Docker крутится, в который окружение прокидывается от compose или k8s.

С выше изложенными условиями выполнить эту задачу по-простому не получится (ну или я не нашёл как). Решение, представленное ниже, не особо-то и сложное, но, на мой взгляд, несколько нетривиально, ну и, если б я нашёл другой способ, то такой огород городить точно не стал бы.

Итак, ближе к делу, берём и переписываем наш Dockerfile следующим образом.

FROM # какой-то образ

WORKDIR /usr/src/app
COPY . /usr/src/app

ENTRYPOINT ["/usr/src/app/start.sh"]

EXPOSE 80

Ключевой момент здесь — ENTRYPOINT, им является какой-то sh-файл (не забудьте ему права на выполнение дать). Этот файл будет преобразовывать наш nginx-конфиг и запускать nginx.

#!/bin/sh

export SEARCH="${SEARCH_FROM_ENV:-google}"

envsubst '${SEARCH}' < /etc/nginx/nginx.conf > /etc/nginx/nginx.conf

nginx -g 'daemon off;'

В строчке экспорта мы “отдаём” переменную SEARCH, которую читаем из переменной окружения “SEARCHFROMENV”.
В случае, если переменная окружения не задана, присваиваем стандартное значение “google”.
После чего обращаемся к системной утилите envsubst, которой конкретно указываем, какие переменные менять, передаём в неё наш конфиг, а результат выполнения пишем в этот же конфиг.
Наконец, запускаем nginx.
В конфиге nginx изначально указываем где-то выражение следующего вида.

if (${SEARCH} = "google") {
  # что-то делаем
}

После обработки envsubst без передачи каких-либо переменных окружения переменная SEARCH заменится на “google”.

if ("google" = "google") {
  # что-то делаем
}

Таким образом мы прокидываем какую-то env-переменную в nginx-конфиг, а так же, в случае неопределённого окружения, имеем значение по-умолчанию.