Передать аргументы в Dockerfile из docker-compose - PullRequest
4 голосов
/ 04 ноября 2019

У меня есть следующая конфигурация моего продукта:

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 голосов
/ 04 ноября 2019

ключевое слово ARG имеет различную область видимости до и после инструкции FROM

Попробуйте дважды использовать ARG в вашем Dockerfile, и / или вы можете попробовать переменные 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
0 голосов
/ 04 ноября 2019

Есть 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}

Тогда вы сможете построить его с передачей аргументов во время сборки:

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, он не устанавливает никаких переменных env, но буквально передает аргументы для шага build.

0 голосов
/ 04 ноября 2019

Вам нужно добавить ARG LANDING_PAGE_DOMAIN=value в ваш Dockerfile:

Из документов

Инструкция ARG позволяет авторам Dockerfile определять значения, которые могут устанавливать пользователиво время сборки с использованием флага --build-arg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...