ENTRYPOINT 배열에서 도커 환경 변수를 사용하려면 어떻게 해야 합니까?
환경 변수를 설정하면 다음과 같이 말합니다.ENV ADDRESSEE=world
다음과 같은 고정 문자열로 연결된 진입점 스크립트에서 사용합니다.
ENTRYPOINT ["./greeting", "--message", "Hello, world!"]
와 함께world
환경 변수의 가치로서 어떻게 해야 합니까?사용해 보았습니다."Hello, $ADDRESSEE"
하지만 그것은 효과가 없어 보입니다, 왜냐하면 그것은 필요하기 때문입니다.$ADDRESSEE
말 그대로.
ENTRYPOINT의 exec 형식을 사용하고 있습니다. 셸 형식과 달리 exec 형식은 명령 셸을 호출하지 않습니다.이것은 정상적인 셸 처리가 이루어지지 않는다는 것을 의미합니다.예를들면,ENTRYPOINT [ "echo", "$HOME" ]
$HOME에 대해 변수 대체를 수행하지 않습니다.셸 처리를 원하는 경우 셸 양식을 사용하거나 셸을 직접 실행합니다. 예:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
.
셸 폼의 경우처럼 exec 폼을 사용하고 셸을 직접 실행할 때 환경 변수 확장을 수행하는 것은 도커가 아니라 셸입니다. (도커 파일 참조)
당신의 경우, 저는 쉘 형태를 사용할 것입니다.
ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
많은 고통과 위의 @vitre et al.로부터 많은 도움을 받은 후, 저는 노력하기로 결정했습니다.
- 표준 bash 대체
- Entrypoint의 셸 형식(위에서 제공하는 유용한 팁)
그리고 그것이 효과가 있었습니다.
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 을 참조하십시오.
저는 제안된 답으로 해결하려고 노력했지만 여전히 몇 가지 문제에 부딪혔습니다.
이것이 제 문제에 대한 해결책이었습니다.
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"]
저는 이 문제를 아주 간단하게 해결했습니다!
중요: 에서 사용할 변수
ENTRYPOINT
유형이어야 합니다(그렇지 않아야 함).ARG
타이프)를 누릅니다.
예 #1:
ARG APP_NAME=app.jar # $APP_NAME can be ARG or ENV type.
ENV APP_PATH=app-directory/$APP_NAME # $APP_PATH must be ENV type.
ENTRYPOINT java -jar $APP_PATH
그러면 다음이 실행됩니다.
java -jar app-directory/app.jar
예 #2(질문):
ARG ADDRESSEE="world" # $ADDRESSEE can be ARG or ENV type.
ENV MESSAGE="Hello, $ADDRESSEE!" # $MESSAGE must be ENV type.
ENTRYPOINT ./greeting --message $MESSAGE
그러면 다음이 실행됩니다.
./greeting --message Hello, world!
- 따옴표가 필요한지 확인하십시오.
""
문자열 변수를 할당할 때 사용합니다.
내 팁: 사용
ENV
대신에ARG
당신이나 당신 쪽의 혼란을 피하기 위해 가능하면 언제든지.SHELL
쪽.
저는 스크립트 이름을 변수에 저장하고 exec 양식을 사용하고 싶었습니다.
참고: 사용하려는 변수가 명령줄 또는 를 통해 환경 변수로 선언되었는지 확인하십시오.ENV
지시의
처음에는 다음과 같은 작업을 수행했습니다.
ENTRYPOINT [ "${BASE_FOLDER}/scripts/entrypoint.sh" ]
하지만 셸 양식을 사용하고 있고 나열된 첫 번째 프로그램이 실행 파일이어야 하기 때문에 분명히 이것은 작동하지 않았습니다.PATH
결국: 문제를해기위해이하, 이게했습다니렇저는.
ENTRYPOINT [ "/bin/bash", "-c", "exec ${BASE_FOLDER}/scripts/entrypoint.sh \"${@}\"", "--" ]
큰따옴표가 필요합니다.
이것이 하는 일은 우리가 여분의 혐의가 전달된 어떤 것이든 가져갈 수 있도록 하는 것입니다./bin/bash
된 후 합니다.
--
A - 옵션 종료를 알리고 추가 옵션 처리를 사용 불가능으로 설정합니다.-- 뒤의 모든 인수는 파일 이름 및 인수로 처리됩니다.ㄹ 수 있습니다. -ㄹ 수 있습니다.
제 경우에는 다음과 같이 작동했습니다. (도커의 Spring boot app용)
ENTRYPOINT java -DidMachine=${IDMACHINE} -jar my-app-name
그리고 도커 런에서 파머를 전달합니다.
docker run --env IDMACHINE=Idmachine -p 8383:8383 my-app-name
다음은 저에게 도움이 되었습니다.
ENTRYPOINT [ "/bin/bash", "-c", "source ~/.bashrc && ./entrypoint.sh ${@}", "--" ]
은 제당신어인제수있습다니에 할 수 .docker run
명령을 실행하고 모든 환경 변수를 읽습니다.
위의 "사용자 정의 스크립트 만들기" 접근 방식을 사용하여 문제를 해결했습니다.다음과 같이:
FROM hairyhenderson/figlet
ENV GREETING="Hello"
RUN printf '#!/bin/sh\nfiglet -W \${GREETING} \$@\n' > /runme && chmod +x /runme
ENTRYPOINT ["/runme"]
CMD ["World"]
좋아요
docker container run -it --rm -e GREETING="G'Day" dockerfornovices/figlet-greeter Alec
만약 누군가가 통과하기를 원한다면,ARG
또는ENV
변수는 ENTRINEPOINT의 exec 형식이며 이미지 빌드 프로세스 중에 생성된 임시 파일이 사용될 수 있습니다.
저의 경우, 앱을 실행하는 것이 가능한지 여부에 따라 다르게 시작해야 했습니다.NET 앱이 자체 포함 여부로 게시되었습니다.제가 한 일은 임시 파일을 만들고 그 이름을 사용한 것입니다.if
나의 bash 스크립트의 진술.
내 도커 파일의 일부:
ARG SELF_CONTAINED=true #ENV SELF_CONTAINED=true also works
# File has to be used as a variable as it's impossible to pass variable do ENTRYPOINT using Exec form. File name allows to check whether app is self-contained
RUN touch ${SELF_CONTAINED}.txt
COPY run-dotnet-app.sh .
ENTRYPOINT ["./run-dotnet-app.sh", "MyApp" ]
run-dotnet-app.sh
:
#!/bin/sh
FILENAME=$1
if [ -f "true.txt" ]; then
./"${FILENAME}"
else
dotnet "${FILENAME}".dll
fi
이전 답변에서는 셸 양식을 사용할 것을 제안합니다.저의 경우에는 이것을 사용하여 신호가 프로세스 자체에 도달할 수 없기 때문에 이것은 옵션이 아니었습니다.
https://hynek.me/articles/docker-signals/ 에서 포인트 1을 참조하십시오.
만약 json 구문이 변수를 해결할 수 있다면, 이것이 제가 원했던 것입니다.
ENTRYPOINT ["${APP_NAME}"]
다음과 같이 실행할 파일을 만드는 경우:
RUN echo "#!/bin/bash \n ${APP_NAME}" > ./entrypoint.sh
새 셸이 생성되므로 신호도 손실됩니다.
2번 지점 참조 및 exec 사용
제게 효과가 있었던 마지막 형태는:
RUN echo "#!/bin/bash \n exec ${APP_NAME}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
여기에 온 것은.envfile
에 대한 정보.docker run
명령을 내리고 결국 다른 곳에서 답을 찾았지만, 다른 사람들을 위해 공유해야겠다고 생각했습니다.
이것이 .envfile synax를 이해하기 위한 핵심이었습니다.
" 이파은구사합니다야용해문을"를 사용해야 합니다.
<variable>=value
(변수를 지정된 값으로 설정) 또는 (로컬 환경에서 값을 가져옵니다), 주석에 대한 #.
저는 이것을 https://docs.docker.com/engine/reference/commandline/run/ #set-environment-filename--e---env---env-file에서 찾았습니다.
말해서, 다시말, 마지하를 하지 .VAR1=$SOME_OTHER_ENV_VAR
언급URL : https://stackoverflow.com/questions/37904682/how-do-i-use-docker-environment-variable-in-entrypoint-array
'sourcecode' 카테고리의 다른 글
두 날짜 사이의 달 수를 계산하는 우아한 방법? (0) | 2023.08.26 |
---|---|
오류 Android 스튜디오에서 Android 에뮬레이터가 사망했습니다. (0) | 2023.08.26 |
JQuery Ajax 요청:사용자-에이전트 변경 (0) | 2023.08.21 |
런타임에 Spring의 @Scheduled fixed delay를 변경하는 방법은 무엇입니까? (0) | 2023.08.21 |
텍스트 파일에서 변수를 검색하는 PowerShell (0) | 2023.08.21 |