从docker-compose将args传递给Dockerfile

时间:2019-11-04 14:25:17

标签: docker docker-compose dockerfile

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

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

我在哪里弄错了?

3 个答案:

答案 0 :(得分:0)

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

docs

  

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

有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文件中删除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}环境变量填充。

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