program tip

Dockerfile의 조건부 ENV

radiobox 2020. 12. 26. 09:50
반응형

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명령 을 사용해야합니다 . 따라서 예를 들어, 당신은 변경할 수 있습니다 ENVRUN하고있는 변수를 내보내 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

반응형