从docker-compose向Dockerfile传递参数

31

我有一个生产环境的配置:

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变量未设置。 默认为空字符串。

我犯了什么错误?


1
在你的Dockerfile中添加ARG值,如ARG LANDING_PAGE_DOMAIN $LANDING_PAGE_DOMAIN或在开始构建之前导出它。 - LinPy
在从Dockerfile构建之前,我收到了组合警告消息,似乎 --build-arg 没有看到我的输入。 - user137
3个回答

9

关键词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

1
"ARG关键字在FROM指令之前和之后的作用域不同" - 这对我来说非常有帮助,谢谢!在文档中没有找到这个信息。 - pixeline
3
真是不可思议。这让我浪费了4个小时的生命。 - Spyros

7

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

  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 文件中注释 / 删除 2 行:

        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步骤传递参数。

虽然你的回答很好,但我认为可能有创造性的解决方法,并没有回答问题,@Nathanael提供了真正的答案。这就是为什么我会给你(非个人)负评的原因。 - jpoppe

0

您需要在Dockerfile中添加ARG LANDING_PAGE_DOMAIN=value

请参考文档

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接