ENTRYPOINT 배열에서 Docker 환경 변수를 어떻게 사용합니까?


109

환경 변수를 설정하면 ENV ADDRESSEE=world다음과 같이 고정 된 문자열로 연결된 진입 점 스크립트에서 사용합니다.

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

world환경 varible의 가치, 어떻게 그것을해야합니까? 나는 사용해 "Hello, $ADDRESSEE"보았지만 $ADDRESSEE문자 그대로 걸리기 때문에 작동하지 않는 것 같습니다 .

답변:


216

ENTRYPOINT 의 exec 형식 을 사용하고 있습니다. 달리 쉘 형태간부 인 형태는 명령 쉘을 호출하지 않습니다. 이것은 정상적인 쉘 처리가 발생하지 않음을 의미합니다. 예를 들어, ENTRYPOINT [ "echo", "$HOME" ]$ HOME에서 변수 대체를 수행하지 않습니다. 쉘 처리를 원하면 쉘 양식을 사용 하거나 쉘을 직접 실행하십시오 (예 :) ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
exec 형태를 사용하고 셸을 직접 실행하면 셸 형태의 경우와 같이 docker가 아닌 환경 변수 확장을 수행하는 셸입니다. ( Dockerfile 참조에서 )

귀하의 경우에는 쉘 형태를 사용 합니다.

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$port동안 ENV port=123. 포트 ENV가 해결되지 않았습니다. 이유는 무엇입니까?
xetra11

1
작동하는 동안 해당 진입 점에 전달 된 인수를 포함하지 않는 것과 같은 몇 가지 새로운 문제가 발생하는 것으로 보입니다. 예를 들어 전달되어야 --attitude "shouting"하는 docker run명령에 인수를 추가 할 수 없습니다./greeting
Daniel F

5
호출 ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"./greeting통해 추가 변수를 전달하려는 경우 docker run(또는 CMDDockerfile 을 전달하려는 경우에도 사용 )
Daniel F

3
쉘 양식은 신호가 프로세스를 통과하지 못하게 할 수 있습니다 ( greeting예시). hynek.me/articles/docker-signals
JBG

`[myexecutable.sh, "$ variable"]과 같은 exec 형식의 환경 변수 값을 얻을 수 있습니까? [ "sh", "-c", "echo $ var"]로 할 수 있지만 그렇지 않습니다. 이런 식으로
나사로

13

제안 된 답변으로 해결하려고 노력했지만 여전히 몇 가지 문제가 발생했습니다 ...

이것은 내 문제에 대한 해결책이었습니다.

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]

특히 문제를 대상으로 :

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

귀하의 답변이 OP의 질문에 대한 완전한 솔루션을 제공하지 않는 것 같습니다
user9405863

나는 그것이 OP의 질문에 대한 해결책을 제공하지 않는 방법을 이해하지 못한다고 생각합니다 ... 나는 정확한 질문을 염두에두고 해결하기 위해 예제로 업데이트했습니다.
Ben Kauffman

당신은 여전히 ​​몇 가지 문제가 발생했다고 언급했습니다!
user9405863

그렇기 때문에 새로운 솔루션을 도입했습니다. ... "허용 된"대답이 저에게 효과가 없었기 때문에 쉘 스크립트에 반향하여 작동했습니다.
Ben Kauffman

2
나는 다음 @ReverendTim 당신의 접근 방식을 청각에 관심이있을 것)
벤 카우프만를

6

많은 고통과 위의 @vitr 등의 큰 도움 끝에 나는 시도하기로 결정했습니다.

  • 표준 bash 대체
  • 쉘 형태엔트리 포인트 (위에서 큰 팁)

그리고 그것은 작동했습니다.

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

예 :

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

docker run --rm -p 8080:80 -d my-image

둘 다 내 컨테이너에서 포트를 올바르게 설정했습니다.

참조

참조 https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html를

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.