Использовать переменные среды в CMD


84

Могу ли я использовать переменные среды в разделе CMD в файле Dockerfile?

Я хочу сделать что-то вроде этого:

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

Где $ MEMCACHE_11211_TCP_ * будет устанавливаться автоматически путем включения параметра --link моей docker runкоманды. И $ ARG может настраиваться пользователем во время выполнения, может быть, с помощью параметра "-e"?

Похоже, это не работает для меня, похоже, это буквально проходит через строку «$ ARG», например.

Ответы:


59

Этот ответ может быть немного запоздалым. Но среда для 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которая будет интерпретировать переменные среды.

В любом случае Docker не оценивает переменные в 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.