How to define build-args in docker-compose?
DockerDocker ComposeContainersDocker Problem Overview
I have the following docker-compose file
version: '3'
services:
node1:
build: node1
image: node1
container_name: node1
node2:
build: node2
image: node2
container_name: node2
I can build both images and start them with a single command
docker-compose up -d --build
But I would like to use build-args on the builds. The original build script of the image outside of the scope of compose looks something like this
#!/bin/sh
docker build \
--build-arg ADMIN_USERNNAME_1=weblogic \
--build-arg ADMIN_PASSWORD_1=weblogic1 \
--build-arg ADMIN_NAME_1=admin \
--build-arg ...
--build-arg ... \
-t test/foo .
Both images would use build-args of the same name but different value. Also, as there are dozens of build args, it would be convenient to store them in a compose service specific build-properties file. Is this possible with docker-compose?
Docker Solutions
Solution 1 - Docker
You can specify the arguments directly in your docker-compose file:
node1:
build:
context: node1
args:
ADMIN_USERNNAME: weblogic1
ADMIN_PASSWORD: weblogic1
ADMIN_NAME: admin1
image: node1
container_name: node1
See a full example: MWE
The official docs have all detail.
Solution 2 - Docker
In your Dockerfile
:
ARG CERTBOT_TAG=latest
FROM certbot/certbot:${CERTBOT_TAG}
In your docker-compose.yml
file:
version: '3.4'
services:
certbot:
build:
context: .
args:
CERTBOT_TAG: v0.40.1
And you can build or up your service:
docker-compose build certbot
Solution 3 - Docker
You can define your args
with your build command of docker-compose.
Example Dockerfile:
FROM nginx:1.13
RUN apt-get -y update && apt-get install -y \
apache2-utils && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
ARG username
ARG password
RUN htpasswd -bc /etc/nginx/.htpasswd $username $password
docker-compose file:
version: '3'
services:
node1:
build: ./dir
The ./dir
contains the Dockerfile and I build with this command:
docker-compose build --build-arg username="my-user" --build-arg password="my-pass"
I see already:
Step 5/5 : RUN htpasswd -bc /etc/nginx/.htpasswd $username $password
---> Running in 80735195e35d
Adding password for user my-user
---> c52c92556825
I bring my stack up:
docker-compose up -d
Now I can check inside the nginx container and my username and (encrypted) password are there:
docker@default:~/test$ docker exec -it test_node1_1 bash
root@208e4d75e2bd:/# cat /etc/nginx/.htpasswd
my-user:$apr1$qg4I/5RO$KMaOPvjbnKdZH37z2WYfe1
Using this method your able to pass build args
to your docker-compose
stack.
Solution 4 - Docker
As Salek mentioned above, adding context: .
helps.
For example:
version: '3.5'
services:
app:
build:
context: .
args:
NODE_VERSION: 14.15.4
`
Solution 5 - Docker
Docker File
ARG ACCOUNT_ID
FROM $ACCOUNT_ID.dkr.ecr.ap-southeast-1.amazonaws.com/my-composer:latest as composer
LABEL stage=intermediate
Buildspec or CLI execute the following command.
docker-compose build --build-arg ACCOUNT_ID="23423432423" --no-cache
If you want to print the ACCOUNT_ID in CLI
ARG ACCOUNT_ID
FROM amazonlinux:latest
RUN yum -y install aws-cli
RUN echo $ACCOUNT_ID
FROM $ACCOUNT_ID.dkr.ecr.ap-southeast-1.amazonaws.com/my-composer:latest as composer
LABEL stage=intermediate
Note: ARG should be on top of all FROM
statement, then it will work as global ARG.