Как я могу экспортировать переменные env в Dockerfile?

#docker #dockerfile

#docker #dockerfile

Вопрос:

Цель

У меня есть файл сценария переменной env, который выглядит как:

 #!/bin/sh
export FOO="public"
export BAR="private"
 

Я хотел бы, чтобы исходные переменные env были доступны при создании образа docker. Я знаю, что могу использовать ARG и ENV с аргументами сборки, но у меня слишком много переменных Env, и я боюсь, что это будет длинный список.

Стоит упомянуть, что мне нужны переменные env только для установки определенного шага в моем файле docker (будет выделено в файле Dockerfile ниже), и я не обязательно хочу, чтобы они были доступны в построенном образе после этого.

Что я пробовал до сих пор

Я пробовал использовать script ( envs.sh ), который экспортирует переменные env, такие как:

 #!/bin/sh
export DOG="woof"
export CAT="meow"
 

Мой файл Docker выглядит так:

 FROM fishtownanalytics/dbt:0.18.1
# Define working directory
# Load ENV Vars
COPY envs.sh envs.sh
CMD ["sh", "envs.sh"]
# Install packages required
CMD ["sh", "-c", "envs.sh"]
RUN dbt deps # I need to env variables to be available for this step

# Exposing DBT Port
EXPOSE 8081
 

Но, похоже, это не сработало. Как я могу экспортировать переменные env в виде скрипта в файл docker?

Комментарии:

1. Могу ли я, по крайней мере, получить объяснение о том, как сделать мой вопрос более понятным, полезным или показать исследовательские усилия до получения dowvote?

Ответ №1:

В общем случае вы не можете задавать переменные среды в RUN команде: каждая RUN команда запускает новую оболочку в новом контейнере, и любые переменные среды, которые вы там устанавливаете, будут потеряны в конце этого RUN шага.

Однако вы говорите, что переменные нужны вам только на одном конкретном шаге в вашем Dockerfile. В этом особом случае вы можете запустить сценарий установки и фактическую команду на одном RUN шаге:

 FROM fishtownanalytics/dbt:0.18.1
COPY envs.sh envs.sh
RUN . ./envs.sh 
 amp;amp; dbt deps
# Anything that envs.sh `export`ed is lost _after_ the RUN step
 

( CMD здесь не имеет значения: он предоставляет только команду по умолчанию, которая запускается при запуске контейнера из созданного образа и не влияет на RUN шаги. Также похоже, что изображение объявляет an ENTRYPOINT , так что вы можете запускать только dbt подкоманды как CMD , а не обычные команды оболочки. Я также использую стандарт . для чтения в файле сценария вместо source , поскольку не у каждого контейнера есть оболочка, которая предоставляет это нестандартное расширение.)

Ответ №2:

Ваш CMD вызов запускает новую оболочку (sh), которая определяет эти переменные, а затем завершается, оставляя текущий процесс неизменным. Если вы хотите, чтобы эти переменные среды применялись к текущему процессу, вы могли source бы:

 CMD ["source", "envs.sh"]
 

Комментарии:

1. Привет @Mureinik. Для меня это имеет смысл. Однако я все еще вижу, что мой RUN dbt deps шаг не подбирает переменные env. Я неправильно выполняю один из шагов?