Set docker build args from .env file (NextJS)
I recently came across the issue that I had to build a Docker container with a NextJS app inside that was relying on a environment variable to set the domain for Plausible.io.
The tricky thing was that I was building the container once and deploying it to multiple pods with different environment configs.
Technically docker can respect a .env
file when it is run with the option --env-file
like so:
docker run --rm --env-file .env -p 3000:3000 -d YOUR_CONTAINER_TAG:prod
So here comes the issue...
But since the environment was set during build time inside the container and NextJS has automatic site optimiziation and builds pre-rendered pages for server-side render during build, the environment variables from the Docker build run were baked into the image and it did not care about the .env
file for server logic.
A small bash script to the rescue
I am using Envault to manage environment configs and since the image is being build with a Jenkins pipeline, the pipeline pulls the correct .env
file from Envault each time.
Inside the Dockerfile
, change the vars to be this:
ARG DB_USERARG DD_SVC_NAMEENV DB_USER=$DB_USERENV DD_SVC_NAME=$ARG DD_SVC_NAME
This means the build command needs to contain --build-arg
paramters for each variable.
To read those from the .env
file via bash, we can use this:
$(for i in `cat .env`; do out+="--build-arg $i " ; done; echo $out;out="")
The docker command looks like this:
docker build -f Dockerfile -t MYTAG:prod $(for i in `cat .env`; do out+="--build-arg $i " ; done; echo $out;out="") .
Bonus round: makefile
Since I love Makefiles, there is a small pitfall how to include the bash loop into the command, so here is my Makefile for reference:
SHELL := /bin/bash...# this line will set the build args from env fileDECONARGS = $(shell echo "$$(for i in `cat .env`; do out+="--build-arg $$i " ; done; echo $$out;out="")")GEN_ARGS = $(eval BARGS=$(DECONARGS)).PHONY: dist-proddist-prod: @echo "Running docker build for PROD ..." $(GEN_ARGS) docker build -f Dockerfile -t $(TAG_SHA) $(BARGS) ....
Original Link: https://dev.to/darksmile92/set-docker-build-args-from-env-file-2p4a
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To