Как предотвратить подмену / затраты переменных в команде определения контейнера AWS Fargate? - PullRequest
0 голосов
/ 25 февраля 2019

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

1 Ответ

0 голосов
/ 25 февраля 2019

В итоге я упростил это, сделав команду, которую мы передадим 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;'"]

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

...