【问题标题】:Pass args to the Dockerfile from docker-compose从 docker-compose 将 args 传递给 Dockerfile
【发布时间】:2019-11-04 14:25:17
【问题描述】:

我有我的产品环境的下一个配置:

docker-compose-prod.yml

version: '3.3'
services:
  nginx:
    build:
      context: nginx
      dockerfile: Dockerfile
      args:
        LANDING_PAGE_DOMAIN: ${LANDING_PAGE_DOMAIN}
    container_name: nginx   
    networks:
      - app-network

Dockerfile

FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf
COPY production/* /etc/nginx/conf.d/

ARG LANDING_PAGE_DOMAIN
RUN sed -i s/{LANDING_PAGE_DOMAIN}/${LANDING_PAGE_DOMAIN}/g /etc/nginx/conf.d/landing.conf

EXPOSE 80 443

所以当我尝试构建它时,我收到了下一个警告:

docker-compose -f docker-compose.production.yml build --build-arg LANDING_PAGE_DOMAIN="test.com" nginx

警告:未设置 LANDING_PAGE_DOMAIN 变量。默认为 空白字符串。

我哪里做错了?

【问题讨论】:

  • 在你的 Dockerfile 中添加 ARG 值ARG LANDING_PAGE_DOMAIN $LANDING_PAGE_DOMAIN或在开始构建之前将其导出
  • 我在从 Dockerfile 构建之前收到了 compose 警告消息,好像 --build-arg 没有看到我的输入

标签: docker docker-compose dockerfile


【解决方案1】:

关键字ARGFROM指令前后的作用域不同

在您的 Dockerfile 中尝试使用 ARG 两次,和/或您可以尝试使用 ENV 变量

ARG LANDING_PAGE_DOMAIN
FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf
COPY production/* /etc/nginx/conf.d/

ARG LANDING_PAGE_DOMAIN
ENV LANDING_PAGE_DOMAIN=${LANDING_PAGE_DOMAIN}

RUN sed -i s/{LANDING_PAGE_DOMAIN}/${LANDING_PAGE_DOMAIN}/g /etc/nginx/conf.d/landing.conf

EXPOSE 80 443

【讨论】:

    【解决方案2】:

    有两种方法可以让它工作:

    1. 使用docker-compose-prod.yml中的现有代码并设置环境 变量LANDING_PAGE_DOMAIN:

      export LANDING_PAGE_DOMAIN=test.com

      然后在不传递构建参数的情况下运行构建步骤:

      docker-compose -f docker-compose.production.yml build nginx

    2. 注释/删除docker-compose-prod.yml文件中的两行:

            args:
              LANDING_PAGE_DOMAIN: ${LANDING_PAGE_DOMAIN}
    

    然后您就可以在构建时通过传递参数来构建它:

    docker-compose -f docker-compose-prod.yml build --build-arg
    LANDING_PAGE_DOMAIN="test.com" nginx
    

    它目前不起作用的原因是因为docker-compose-prod.yml 文件中的这两行明确将LANDING_PAGE_DOMAIN 参数设置为由${LANDING_PAGE_DOMAIN} 环境变量填充。

    当您使用--build-arg 选项运行docker-compose build 时,它不会设置任何环境变量,而是会为build 步骤传递参数。

    【讨论】:

      【解决方案3】:

      您需要将ARG LANDING_PAGE_DOMAIN=value 添加到您的 Dockerfile:

      来自docs

      ARG 指令允许 Dockerfile 作者定义用户的值 可以在构建时使用 --build-arg 标志设置

      【讨论】:

        猜你喜欢
        • 2019-10-25
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 1970-01-01
        • 2020-01-11
        • 2021-12-13
        相关资源
        最近更新 更多