.env 파일(NextJS)에서 도커 빌드 인수 설정

4308 단어 dockerdevops
나는 최근에 Plausible.io 에 대한 도메인을 설정하기 위해 환경 변수에 의존하는 NextJS 앱이 포함된 Docker 컨테이너를 빌드해야 하는 문제를 발견했습니다.
까다로운 점은 컨테이너를 한 번 빌드하고 환경 구성이 다른 여러 포드에 배포한다는 것입니다.

기술적으로 도커는 다음과 같이 옵션.env과 함께 실행될 때 --env-file 파일을 존중할 수 있습니다.

docker run --rm --env-file .env -p 3000:3000 -d YOUR_CONTAINER_TAG:prod


그래서 여기에 문제가 있습니다 ...



그러나 환경은 컨테이너 내부의 빌드 시간 동안 설정되었고 NextJS는 자동 사이트 최적화 기능이 있으며 빌드 중에 서버 측 렌더링을 위해 미리 렌더링된 페이지를 빌드하기 때문에 Docker 빌드 실행의 환경 변수가 이미지에 구워져 신경쓰지 않았습니다. 서버 논리에 대한 .env 파일에 대해.

구조를 위한 작은 bash 스크립트



Envault를 사용하여 환경 구성을 관리하고 있으며 이미지가 Jenkins 파이프라인으로 빌드되고 있기 때문에 파이프라인은 매번 Envault에서 올바른.env 파일을 가져옵니다.Dockerfile 내부에서 vars를 다음과 같이 변경합니다.

ARG DB_USER
ARG DD_SVC_NAME
ENV DB_USER=$DB_USER
ENV DD_SVC_NAME=$ARG DD_SVC_NAME


이는 빌드 명령이 각 변수에 대한 매개변수--build-arg를 포함해야 함을 의미합니다.
bash를 통해 .env 파일에서 이를 읽으려면 다음을 사용할 수 있습니다.

$(for i in `cat .env`; do out+="--build-arg $i " ; done; echo $out;out="")


도커 명령은 다음과 같습니다.

docker build -f Dockerfile -t MYTAG:prod $(for i in `cat .env`; do out+="--build-arg $i " ; done; echo $out;out="") .


보너스 라운드: makefile



나는 Makefile을 좋아하기 때문에 명령에 bash 루프를 포함하는 방법에 약간의 함정이 있습니다. 그래서 참조용 Makefile은 다음과 같습니다.

SHELL := /bin/bash
...
# this line will set the build args from env file
DECONARGS = $(shell echo "$$(for i in `cat .env`; do out+="--build-arg $$i " ; done; echo $$out;out="")")
GEN_ARGS = $(eval BARGS=$(DECONARGS))

.PHONY: dist-prod
dist-prod:
    @echo "Running docker build for PROD ..."
        $(GEN_ARGS)
    docker build -f Dockerfile -t $(TAG_SHA) $(BARGS) .
...

좋은 웹페이지 즐겨찾기