Передача переменной среды в контейнер не работает - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть эта команда:

docker run -e "DB_HOST=thehost" --rm my_application echo $DB_HOST

, но она ничего не показывает.Я ожидал, что появится «thehost».

Я пробовал с простыми кавычками, двойными кавычками и без кавычек.

Чего мне не хватает?Нужно ли указывать параметр ENV в Dockerfile my_aplication?

Если я это сделаю:

docker run -e "DB_HOST=thehost" --rm my_application echo $PATH

Он правильно показывает значение PATH.Но это игнорирование моего env var.

1 Ответ

0 голосов
/ 23 декабря 2018

Здесь есть несколько слоев:

  1. Ваша локальная оболочка расширяет команду;
  2. , которая запускает некоторый контейнер Docker;
  3. , которая запускает некоторыедругой процесс (но не обязательно оболочка).

В вашем первом примере

docker run ... echo $DB_HOST

ваша локальная оболочка перехватывает ссылку на переменную до того, как она будет передана в Docker.

Если вы явно заключите его в одинарные кавычки

docker run ... echo '$DB_HOST'

Docker найдет /bin/echo (при условии, что он существует в контейнере) и запустит его со строкой $DB_HOST в качестве аргумента, но снова:поскольку на стороне докера не задействована оболочка, она покорно печатает эту строку как есть.

Непосредственный ответ на ваш вопрос заключается в том, чтобы на стороне докера была установлена ​​оболочка

docker run -e DB_HOST=thehost --rm my_application \
  sh -c 'echo $DB_HOST'

На немного более высоком уровне:

  • Если вы запускаете программу на каком-то другом языке, а не просто команду оболочки, они будут нормально видеть среду (Python os.environ, Ruby's ENV, Node's process.env, и т. Д. )
  • Если у вас есть что-то даже немного сложное, запишите его в сценарий оболочки, скопируйте его в изображение и запустите, что, вероятно, более легко обслуживать, и неявно включает в себя оболочку (первая строка скажет #!/bin/sh)
  • В вашем Dockerfile, если вы скажете CMD some command, Docker автоматически обернет это в оболочку;это эквивалентно CMD ["sh", "-c", "some command"]
  • То же самое верно для ENTRYPOINT, но это, вероятно, ошибка, использовать его таким образом
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...