Dockerfile의 조건부 ENV
ENV
빌드 값을 기반으로 Dockerfile에서 조건부로 변수를 설정할 수 ARG
있습니까?
예 : 다음과 같은 것
ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
업데이트 : Mario의 답변에 따른 현재 사용량 :
ARG BUILD_ENV=prod
ENV NODE_ENV=production
RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi
그러나 --build-arg BUILD_ENV=test
호스트로 실행 한 다음 계속 진행하면 여전히
docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production
예, 가능하지만 빌드 인수를 플래그로 사용해야합니다. 셸의 매개 변수 확장 기능을 사용 하여 상태를 확인할 수 있습니다. 다음은 개념 증명 Docker 파일입니다.
FROM debian:stable
ARG BUILD_DEVELOPMENT
# if --build-arg BUILD_DEVELOPMENT=1, set NODE_ENV to 'development' or set to null otherwise.
ENV NODE_ENV=${BUILD_DEVELOPMENT:+development}
# if NODE_ENV is null, set it to 'production' (or leave as is otherwise).
ENV NODE_ENV=${NODE_ENV:-production}
테스트 빌드 :
docker build --rm -t env_prod ./
...
docker run -it env_prod bash
root@2a2c93f80ad3:/# echo $NODE_ENV
production
root@2a2c93f80ad3:/# exit
docker build --rm -t env_dev --build-arg BUILD_DEVELOPMENT=1 ./
...
docker run -it env_dev bash
root@2db6d7931f34:/# echo $NODE_ENV
development
Dockerfile에서 직접 bash 코드를 실행할 수는 없지만 RUN
명령 을 사용해야합니다 . 따라서 예를 들어, 당신은 변경할 수 있습니다 ENV
로 RUN
하고있는 변수를 내보내 if
아래와 같이 :
ARG BUILDVAR=sad
RUN if [ "$BUILDVAR" == "SO" ]; \
then export SOMEVAR=hello; \
else export SOMEVAR=world; \
fi
나는 그것을 시도하지 않았지만 작동해야합니다.
조건부 ENV
변수를 설정할 수는 없지만 RUN
명령과 null-coalescing 환경 변수를 사용하여 수행 한 작업을 완료 할 수 있습니다 .
RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}}
당신의 논리는 실제로 정확합니다. 여기서 문제 RUN export ...
는 export
명령이 이미지간에 지속되지 않기 때문에 Dockerfile에서 작동하지 않는다는 것입니다 . Dockerfile은 이미지를 생성하기 위해 임시 컨테이너를 생성하므로 환경 변수가 존재하지 않습니다.
ENV
반면에 문서에 따르면 다음과 같습니다.
를 사용하여 설정 한 환경 변수
ENV
는 결과 이미지에서 컨테이너가 실행될 때 유지됩니다.
이 작업을 수행하는 유일한 방법은 docker run
이미지에서 컨테이너를 생성 할 때 명령 을 수행하는 동안 다음 과 같이 논리를 래핑하는 것입니다.
if [ "${BUILD_ENV}" = "test" ]; then
docker run -e NODE_ENV=development myimage
else
docker run myimage
fi
Dockerfile에 값을 전달한 다음 진입 점 스크립트에 전달
명령 줄에서 필요한 값 (TARG)을 전달합니다.
docker run --env TARG=T1_WS01 -i projects/msbob
그런 다음 다음과 같이 Dockerfile
넣으 십시오.
Dockerfile:
# if $TARG is not set then "entrypoint" defaults to Q0_WS01
CMD ./entrypoint.sh ${TARG} Q0_WS01
entrypoint.sh
스크립트는 첫 번째 인수를 읽고
entrypoint.sh:
#!/bin/bash
[ $1 ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; }
target_env=$1
참조 URL : https://stackoverflow.com/questions/37057468/conditional-env-in-dockerfile
'program tip' 카테고리의 다른 글
HTML5 웹 사이트에서 QR 코드 리더를 만드는 방법은 무엇입니까? (0) | 2020.12.26 |
---|---|
Android Studio 2.0으로 업그레이드 한 후 Gradle 빌드 중 많은 오류 발생 (0) | 2020.12.26 |
IIS7-요청 콘텐츠 길이를 초과하는 요청을 거부하도록 요청 필터링 모듈이 구성됨 (0) | 2020.12.26 |
Rails 3에서 리소스 생성 작업이 실패하고 render : new를 호출 할 때 URL이 리소스의 인덱스 URL로 변경되어야하는 이유는 무엇입니까? (0) | 2020.12.26 |
“brew link”는 무엇을합니까? (0) | 2020.12.26 |