Використовуйте змінні середовища в CMD


84

Чи можу я використовувати змінні середовища у своїй строфі CMD у файлі Docker?

Я хочу зробити щось подібне:

CMD ["myserver", "--arg=$ARG", "--memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT"]

Де $ MEMCACHE_11211_TCP_ * буде встановлено автоматично, включивши параметр --link моєї docker runкоманди. І $ ARG може бути налаштований користувачем під час виконання, можливо, за параметром "-e"?

Здається, це не працює для мене, здається, буквально проходить через рядок "$ ARG", наприклад.

Відповіді:


57

Ця відповідь може трохи запізнитися. Але середовище для CMDінтерпретується дещо інакше залежно від того, як ви пишете аргументи. Якщо ви передасте CMDяк рядок (не всередині масиву), він запускається як оболонка замість exec. Див. Https://docs.docker.com/engine/reference/builder/#cmd .

Ви можете спробувати CMDсинтаксис без масиву запустити як оболонку:

CMD myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT


11

Обидва Енді мали це правильно. Синтаксис json обходить точку входу. Коли ви використовуєте CMD, як у їх прикладі, це розглядається як аргумент для точки входу за замовчуванням:/bin/sh -c яка буде інтерпретувати змінні середовища.

Докер не обчислює змінні в CMD в обох випадках. У першій команді викликається безпосередньо, тому ніщо не піддається інтерпретації, у пізнішій змінні інтерпретуються sh.


7

Я не можу говорити про те, як це має працювати, але я думаю, якщо б ви назвали це як скрипт оболонки, наприклад CMD runmyserver.sh, тоді інтерпретація змінних оболонки буде відкладена, поки CMD насправді не запуститься.

Отже, спробуйте

myserver --arg=$ARG --memcache=$MEMCACHE_11211_TCP_ADDR:$MEMCACHE_11211_TCP_PORT`` 

як сценарій оболонки?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.