Локально при запуске docker с 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
.
При работе на AWG 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}'
перед тем, как предоставить ее в качестве команды для запуска Docker.Мое намерение состоит в том, чтобы указать это как буквальную строку.
Есть ли способ избежать этого / остановить расширение.Я пробовал что-то вроде '\\\\${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, он работает как шарм ...