将 args 从 docker-compose 传递给 Dockerfile

use*_*137 11 docker dockerfile docker-compose

我有我的 prod env 的下一个配置:

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
Run Code Online (Sandbox Code Playgroud)

文件

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
Run Code Online (Sandbox Code Playgroud)

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

docker-compose -f docker-compose.production.yml build --build-arg LANDING_PAGE_DOMAIN="test.com" nginx
Run Code Online (Sandbox Code Playgroud)

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

我哪里做错了?

Nat*_*ael 14

指令ARG前后关键字的范围不同FROM

尝试在 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
Run Code Online (Sandbox Code Playgroud)

  • 难以置信。这耗费了我 4 个小时的生命。 (4认同)

esb*_*ych 8

有 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. 注释/从文件中删除 2 行docker-compose-prod.yml

        args:
          LANDING_PAGE_DOMAIN: ${LANDING_PAGE_DOMAIN}
Run Code Online (Sandbox Code Playgroud)

然后您将能够在构建时通过传递参数来构建它:

docker-compose -f docker-compose-prod.yml build --build-arg
LANDING_PAGE_DOMAIN="test.com" nginx
Run Code Online (Sandbox Code Playgroud)

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

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


rok*_*rok 0

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

来自文档

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