#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. Я неправильно выполняю один из шагов?