Dockerfile FROM + ARG trick — parameterized dockerfile base image
For long time I thought that it was impossible to parameterize FROM instruction in a Dockerfile.
FROM node:10-alpine
Let’s say you want to reuse your Dockerfile (DRY) for multiple applications but with different versions of node (this is just one of multiple examples):
- APP_1: node:10-alpine
- APP_2: node:12-alpine
You probably ended up creating 2 Dockerfiles with different FROM instructions but basically the same content.
Enter the trick
One can parameterize the FROM instruction using an ARG instruction above!
# MAGIC! if no arg provided default to "10-alpine"ARG node_version=10-alpine
FROM node:${node_version}COPY package.json .
RUN npm install # we can use ARG for other thingsARG app_id=1COPY packages/app_${app_id} .CMD ["node", "app.js"]
and you can use build-args to specify:
- which version tag of node image you want to use
- even specify which folders to copy
# build app_1app_id=1
docker build --build-arg "node_version=10-alpine" --build-arg "app_id=${app_id}" -t myapp:${app_id} .# build app_2app_id=2
docker build --build-arg "node_version=12-alpine" --build-arg "app_id=${app_id}" -t myapp:${app_id} .
There you have it, hope you like it!
Q. What is the first instruction in a Dockerfile?
A. FROM … not really