如何在docker-compose中定义build-args?

时间:2018-06-07 06:27:02

标签: docker docker-compose containers

我有以下docker-compose文件

version: '3'
services:
    node1:
            build: node1
            image: node1
            container_name: node1

    node2:
            build: node2
            image: node2
            container_name: node2

我可以构建两个图像并使用单个命令启动它们

docker-compose up -d --build

但是我想在构建中使用build-args。在compose范围之外的图像的原始构建脚本看起来像这样

#!/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 .

两个图像都将使用同名但不同值的build-args。此外,由于存在许多构建参数,因此将它们存储在特定于服务的特定构建属性文件中会很方便。这是否可以使用docker-compose?

5 个答案:

答案 0 :(得分:7)

您可以使用docker-compose的构建命令定义args

实施例 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

./dir包含Dockerfile,我用这个命令构建:

docker-compose build --build-arg username="my-user" --build-arg password="my-pass"

我已经看到了:

Step 5/5 : RUN htpasswd -bc /etc/nginx/.htpasswd $username $password
 ---> Running in 80735195e35d
Adding password for user my-user
 ---> c52c92556825

我带上了我的筹码:

docker-compose up -d

现在我可以在nginx容器内查看,我的用户名和(加密)密码在那里:

docker@default:~/test$ docker exec -it test_node1_1 bash
root@208e4d75e2bd:/# cat /etc/nginx/.htpasswd
my-user:$apr1$qg4I/5RO$KMaOPvjbnKdZH37z2WYfe1

使用此方法,您可以将build args传递到docker-compose堆栈。

答案 1 :(得分:1)

您可以直接在docker-compose文件中指定参数:

node1:
    build: node1
        args:
            ADMIN_USERNNAME: weblogic1
            ADMIN_PASSWORD: weblogic1
            ADMIN_NAME: admin1
    image: node1
    container_name: node1

有关详细信息,请参见official docs

答案 2 :(得分:1)

在您的dockerfile中:

File "<ipython-input-3-b744a07ba8b3>", line 1
    spexxytools grid create --from-filename "lte(?P<Teff>\d{5})-(?P<logg>\d\.\d\d)(?P<FeH>[+-]\d\.\d)(\.Alpha=(?P<Alpha>[+-]\d\.\d\d))?\.PHOENIX"
                   ^
SyntaxError: invalid syntax

在您的docker-compose.yml中:

  File "/home/geoffrey/.local/bin/spexxy", line 4, in <module>
    __import__('pkg_resources').run_script('spexxy==2.3', 'spexxy')
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 658, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 1429, in run_script
    .format(**locals()),
pkg_resources.ResolutionError: Script 'scripts/spexxy' not found in metadata at '/home/geoffrey/.local/lib/python3.6/site-packages/spexxy-2.3.dist-info'

您可以将@lvthillo解决方案与'--build-arg'一起使用

答案 3 :(得分:1)

正如 Salek 上面提到的,添加 context: . 有帮助。

例如:

version: '3.5'
services:
  app:
    build:
      context: .
      args:
        NODE_VERSION: 14.15.4
       

`

答案 4 :(得分:0)

Docker 文件

ARG ACCOUNT_ID

FROM $ACCOUNT_ID.dkr.ecr.ap-southeast-1.amazonaws.com/my-composer:latest as composer
LABEL stage=intermediate

Buildspec 或 CLI 执行以下命令。

docker-compose build --build-arg ACCOUNT_ID="23423432423" --no-cache

如果您想在 CLI 中打印 ACCOUNT_ID

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

注意:ARG 应该在所有 FROM 语句之上,然后它将作为全局 ARG 工作。