2014-04-14 2 views
53

Dockerfile의 CMD 스탠자에서 환경 변수를 사용할 수 있습니까?CMD에서 환경 변수 사용

나는 이런 식으로 뭔가를하고 싶지 : $ MEMCACHE_11211_TCP_ *이 내 docker run 명령의 --link 매개 변수의 포함에 의해 자동으로 설정됩니다

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

. 그리고 $ ARG는 런타임에 사용자가 구성 할 수 있습니다. 아마도 "-e"매개 변수로 구성 할 수 있습니까?

이것은 나를 위해 작동하지 않는 것 같습니다. 문자 그대로 "$ ARG"라는 문자열을 통과 한 것처럼 보입니다.

답변

5

나는 을 어떻게 작동하는지에 대해 말할 수 없다.이 작동하려면 좋겠지 만, 이것을 쉘 스크립트라고 부른다면 나는 생각한다. CMD runmyserver.sh이면 CMD가 실제로 실행될 때까지 쉘 변수의 해석이 지연됩니다.

그래서, 쉘 스크립트로

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

를 시도?

32

이 답변은 조금 늦을 수 있습니다. 그러나 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 
9

두 Andys가 바로 있었다. json 구문은 진입 점을 무시합니다. 예제에서와 같이 CMD를 사용하면 기본 입력 지점 인 /bin/sh -c에 대한 인수로 간주되어 environement 변수를 해석합니다.

Docker는 두 경우 모두 CMD의 변수를 평가하지 않습니다. 전자에서는 명령이 직접 호출되므로 아무 것도 해석되지 않습니다. 나중에 변수는 sh으로 해석됩니다.

8
CMD ["sh", "-c", "echo ${MY_HOME}"] 

답은 sffits here입니다.