Локально при запуске докера с docker run
я передаю некоторые аргументы, например:
docker run -p 8080:80 -e "SERVICE_B_URL=somehost.co.uk" -d mynginx:latest /bin/sh -c "envsubst '\${SERVICE_B_URL}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
Это прекрасно работает. В моем /etc/nginx/conf.d/default.conf
строка ${SERVICE_B_URL}
заменена на somehost.co.uk
.
При работе на AWS fargate с таким определением, как:
"environment": [
{
"name": "SERVICE_B_URL",
"value": "someotherhost.co.uk"
}
],
"command": [
"/bin/sh",
"-c",
"envsubst '\\${SERVICE_B_URL}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
],
\\
должен был экранировать \
в файле JSON.
При попытке запуска контейнер выходит с ошибкой, потому что NGINX видит буквальную строку ${SERVICE_B_URL}
. Когда я проверяю контейнер и вижу команду AWS, используемую для запуска контейнера, это:
Command ["/bin/sh","-c","envsubst '\\' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]
Обратите внимание, что Fargate попытался раскрыть строку '\\${SERVICE_B_URL}'
перед тем, как передать ее в качестве команды для запуска докера. Я намерен указать это как буквальную строку.
Есть ли способ избежать этого / остановить расширение. Я пробовал такие вещи, как '\\\\${SERVICE_B_URL}'
-> '\\'
.
Сноска, если вам интересно, почему я указываю '\${SERVICE_B_URL}'
на envsubst
вместо того, чтобы просто использовать:
docker run -p 8080:80 -e "SERVICE_B_URL=somehost.co.uk" -d mynginx:latest /bin/sh -c "envsubst < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
Причина в том, что заменяемый файл содержит другую конфигурацию NGINX, в которой используются переменные с синтаксисом $
. Поэтому, чтобы предотвратить их замену на envsubst
, я явно называю переменную, которую хочу заменить. Работает локально с docker run, работает как шарм ...