How to define build-args in docker-compose?

DockerDocker ComposeContainers

Docker 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTuomas ToivonenView Question on Stackoverflow
Solution 1 - DockerRaphaelView Answer on Stackoverflow
Solution 2 - DockerheralightView Answer on Stackoverflow
Solution 3 - DockerlvthilloView Answer on Stackoverflow
Solution 4 - DockerPHZ.fi-PharazonView Answer on Stackoverflow
Solution 5 - DockerBiraView Answer on Stackoverflow