Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to define build-args in docker-compose?

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?

like image 629
Tuomas Toivonen Avatar asked Jun 07 '18 06:06

Tuomas Toivonen


People also ask

How do I pass args to Dockerfile build?

If you want to pass multiple build arguments with docker build command you have to pass each argument with separate — build-arg. docker build -t <image-name>:<tag> --build-arg <key1>=<value1> --build-arg <key2>=<value2> .

What does -- build do in Docker compose?

Define and run multi-container applications with Docker. docker-compose build : This command builds images in the docker-compose. yml file. The job of the build command is to get the images ready to create containers, so if a service is using the prebuilt image, it will skip this service.


2 Answers

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.

like image 50
Raphael Avatar answered Sep 19 '22 09:09

Raphael


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.

like image 31
lvthillo Avatar answered Sep 20 '22 09:09

lvthillo