Dockerfile CMD 내에서 변수를 어떻게 사용할 수 있습니까?


104

내 Dockerfile 내부 :

ENV PROJECTNAME mytestwebsite
CMD ["django-admin", "startproject", "$PROJECTNAME"]

오류:

CommandError: '$PROJECTNAME' is not a valid project name

여기서 가장 빠른 해결 방법은 무엇입니까? Docker는 이후 버전의 Docker에서이 기능을 "수정"하거나 도입 할 계획이 있습니까?

참고 : Docker 파일에서 CMD 줄을 제거한 다음 Docker 컨테이너를 실행하면 컨테이너 내부에서 Django-admin startproject $ PROJECTNAME을 수동으로 실행할 수 있으며 프로젝트가 생성됩니다.


1
언제 어떻게 정의하고 $PROJECTNAME있습니까?
Piotr Wittchen 2016

ENV를 사용하는 Dockerfile의 시작 부분. 또한 Dockerfile에서 CMD 줄을 제거한 다음 컨테이너를 실행하면 컨테이너 내부에서이 명령을 실행할 수 있으며 프로젝트가 생성된다는 것을 언급하는 것을 잊었습니다 (ENV 변수가 유효 함).
david

어떤 유형의 변수를 의미합니까 : dockerfile 변수 또는 환경 변수 (시스템 런타임에서와 같이)?
emix

답변:


164

다음과 같이 실행 목록을 사용할 때 ...

CMD ["django-admin", "startproject", "$PROJECTNAME"]

... 그러면 Docker는 셸을 사용하지 않고 주어진 명령을 직접 실행합니다 . 관련된 셸이 없기 때문에 다음을 의미합니다.

  • 변수 확장 없음
  • 와일드 카드 확장 없음
  • 없음 I / O 리디렉션 >, <, |, 등
  • 다음을 통한 여러 명령 없음 command1; command2
  • 기타 등등.

당신이 원하는 경우 CMD확장 변수를, 당신은 쉘을 준비해야합니다. 다음과 같이 할 수 있습니다.

CMD ["sh", "-c", "django-admin startproject $PROJECTNAME"]

또는 실행 목록 대신 간단한 문자열을 사용하여 이전 예제와 거의 동일한 결과를 얻을 수 있습니다.

CMD django-admin startproject $PROJECTNAME

2
Docker의 이슈 트래커에서 더 읽어보기 : github.com/docker/docker/issues/5509
jannis

@larsks 간단한 문자열 놀랍
abdoutelb

당신은 내 하루를 구했습니다!
Supratim Roy

18

런타임에 ENV값을 사용하려면 Dockerfile. 빌드 할 때 사용하려면 ARG.

예 :

ARG value
ENV envValue=$value
CMD ["sh", "-c", "java -jar ${envValue}.jar"]

빌드 명령에 값을 전달하십시오.

docker build -t tagName --build-arg value="jarName"

10

컨테이너 내부에서 Java 프로세스를 시작한다고 가정 해 보겠습니다.

Dockerfile 발췌 예 :

ENV JAVA_OPTS -XX +UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=1 -XshowSettings:vm 
... 
ENTRYPOINT ["/sbin/tini", "--", "entrypoint.sh"] 
CMD ["java", "${JAVA_OPTS}", "-myargument=true"]

예제 entrypoint.sh 발췌 :

#!/bin/sh 
... 
echo "*** Startup $0 suceeded now starting service using eval to expand CMD variables ***"
exec su-exec mytechuser $(eval echo "$@")

0

위에서 영감을 받아 이렇게했습니다.

#snapshot by default. 1 is release.
ENV isTagAndRelease=0

CMD     echo is_tag: ${isTagAndRelease} && \
        if [ ${isTagAndRelease} -eq 1 ]; then echo "release build"; mvn -B release:clean release:prepare release:perform; fi && \
        if [ ${isTagAndRelease} -ne 1 ]; then echo "snapshot build"; mvn clean install; fi && \ 
       .....
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.