Докер установил ENV на основе if-else - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть ситуация, когда мне нужно установить ENV на основе условия времени, например, так:

RUN if [ "$RUNTIME" = "prod" ] then VARIABLE="Some Production URL"; else VARIABLE="Some QA URL"; fi;
ENV={VARIABLE}

Я смотрел на различные решения, но ни одно из них, похоже, не работает (например, базовое решение).где переменная теряется при выходе из RUN).Каким будет элегантный способ добиться этого?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

К сожалению, у вас есть только эта переменная окружения «dev / qa / prod».Однако можно достичь того, чего вы хотите.

Во-первых, вы можете подумать о том, чтобы сконфигурировать конфигурацию, специфичную для вашей среды, в образ для всех сред.( Обычно я бы не рекомендовал делать это! ) Например, вы можете COPY три файла в ваше изображение:

  • dev-env.sh: содержит вашу конфигурацию dev в форме:ELASTICSEARCH_URL=http://elastic-dev:123
  • qa-env.sh (аналог)
  • prod-env.sh (аналог)

Затем выполняется оценка во время выполнения (не во время сборки)в какой среде вы: Вы добавляете скрипт ENTRYPOINT к своему изображению, который будет источником правильного файла, в зависимости от переменной ENVIRONMENT_NAME.

Dockerfile (part):

ENTRYPOINT ["docker-entrypoint.sh"]

docker-entrypoint.sh (скопировано в WORKDIR изображения):

#!/bin/bash
set -e

if [ "$ENVIRONMENT_NAME" = "prod" ]; then
    source prod-env.sh
fi
# else if qa ... , else if dev ..., else fail

exec "$@"

Этот сценарий будет запускаться при запуске контейнера Docker, поэтому этот подход не подходит для вас, если вам нужны переменныебыть доступным в инструкциях Dockerfile (во время сборки).

Другой (во время сборки) обходной путь описан здесь и состоит из использования временных файлов для хранения переменных среды в нескольких слоях изображения.

0 голосов
/ 14 декабря 2018

Буквальное условное выполнение может быть достигнуто с помощью многоступенчатой ​​сборки и ONBUILD.

ARG mode=prod

FROM alpine as img_prod
ONBUILD ENV ELASTICSEARH_URL=whatever/for/prod

FROM alpine as img_qa
ONBUILD ENV ELASTICSEARH_URL=whatever/for/qa

FROM img_${mode}
...

Затем вы строите с docker build --build-arg mode=qa .

0 голосов
/ 14 декабря 2018

Не будет ли передача env var с docker run решением, которое вам нужно?Как то так:

docker run -e YOUR_VARIABLE="Some Production URL" ...

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