【问题标题】:How to pass arguments within docker-compose?如何在 docker-compose 中传递参数?
【发布时间】:2015-12-16 21:41:36
【问题描述】:

Docker 1.9 允许将参数传递给 dockerfile。 见链接:https://docs.docker.com/engine/reference/builder/#arg

如何在 docker-compose.yml 中传递相同的参数?
如果可能,也请提供一个例子。

【问题讨论】:

    标签: docker dockerfile docker-compose


    【解决方案1】:

    现在docker-compose 支持变量替换。

    Compose 使用运行 docker-compose 的 shell 环境中的变量值。例如,假设 shell 包含 POSTGRES_VERSION=9.3 并且您在 docker-compose.yml 文件中提供此配置:

    db:
      image: "postgres:${POSTGRES_VERSION}"
    

    当您使用此配置运行 docker-compose up 时,Compose 会在 shell 中查找 POSTGRES_VERSION 环境变量并将其值代入其中。对于此示例,Compose 在运行配置之前将 image 解析为 postgres:9.3

    【讨论】:

    • 构建参数是 Docker 1.9 的一个特性,问题询问如何让 Docker Compose 使用它们。变量替换无关。
    • @Jack 我知道这不是问题的直接答案,但它可能是一种解决方法,因为docker-compose 不支持传递参数。
    • @Jack 我来这里是为了寻找变量替换,所以这对我很有帮助
    • 暂时会用这个。不能使用docker-compose run 传递参数,因为参数必须传递给多个容器。
    • @weberc2 我知道此时您应该已经想通了,但我会把它留给其他人。您可以在docker-compose.yml 文件中将其设置为具有默认值的环境。 environment:\n PLATFORM_VERSION: "${PLATFORM_VERSION:-v1.0.0}"。 PS:\n 只是因为我找不到在 cmets 中格式化多行代码块的方法。
    【解决方案2】:

    现在可以在 docker-compose v2+ 中作为build 对象的一部分来完成此操作;

    docker-compose.yml

    version: '2'
    services:
        my_image_name:
            build:
                context: . #current dir as build context
                args:
                    var1: 1
                    var2: c
    

    the docker compose docs

    在上面的示例中,“var1”和“var2”将被发送到构建环境。

    注意:任何与args 变量同名的环境变量(使用environment 块指定)都将覆盖该变量。

    【讨论】:

    • @tfg 你知道args 键是否需要小写吗?我看到的文档和所有示例都使用小写键,但我没有看到任何提到它是必需的
    • @pdoherty926 这应该只是 bash 变量扩展,所以带下划线的大写和小写应该没问题。
    • @tfg 谢谢。同时,我自己也得出了这个结论。您知道为什么文档/示例使用该约定吗?
    • 不幸的是,这不适用于堆栈:“在使用(版本 3)撰写文件以群模式部署堆栈时,此选项将被忽略。docker stack 命令仅接受预构建的图像”来自docs.docker.com/compose/compose-file/#build
    • @tgallacher AFAIK,environment 块中的变量不会覆盖args 变量。只是args变量在容器构建过程期间可用,而environment变量在容器运行时可用。
    【解决方案3】:

    Compose 文件格式 1.6 中添加了此功能。

    参考:https://docs.docker.com/compose/compose-file/#args

    services:
      web:
        build:
          context: .
          args:
            FOO: foo
    

    【讨论】:

    • 当我运行docker-compose version 时,它显示的是 1.29.1,并且在撰写本文时,它是最新的。 1.6?
    • @volvox 他指的是Compose file format(撰写),你指的是docker-compose,不同的东西。 1.6 现已弃用。这篇文章很老了:)
    【解决方案4】:

    在这些答案中添加一些内容,args 仅在使用 docker-compose up --build 而不是在使用 docker-compose build 时被拾取。如果你想在不同的步骤中构建和运行,你需要使用docker-compose build --build-arg YOUR_ENV_VAR=${YOUR_ENV_VAR}docker build --build-arg YOUR_ENV_VAR=${YOUR_ENV_VAR}

    【讨论】:

      【解决方案5】:
      1. 在 Linux shell 上创建变量环境:

        export TAG=0.1.2
        
      2. 在 docker-compose.yml 中设置变量

        db:
          image: "redis:${TAG}"
        
      3. 验证值是否被替换

        docker-compose config
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多