Как предотвратить замену / расширение переменных в команде определения контейнера AWS Fargate

Локально при запуске докера с 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, работает как шарм ...


person David    schedule 24.02.2019    source источник


Ответы (1)


В итоге я упростил это, выполнив команду, которую мы передадим docker run части самого Dockerfile, используя CMD, например:

CMD ["/bin/sh","-c","envsubst '\\${SERVICE_B_URL}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"]

Теперь мы можем удалить конфигурацию command из файла JSON для Fargate.

person David    schedule 25.02.2019