Рубрики
Uncategorized

Озадачен вокруг Arg Env и .env в DockerFile

Яш шах предварительное условие: — Базовое понимание докерафила Недавно я пришел в дело … Помечено с Docker, учебником, Devops.

Яш Шах

Пререквизит: — Базовое понимание докерафила

Недавно я пришел к использованию случая, когда мне пришлось создавать изображение на основе параметров, которые зависят от окружающей среды, в настоящее время я строю свой контейнер. Следовательно, я использую ARG, чтобы пройти аргументы при создании контейнера. И созданиерица на основании ARG, которую я предоставил.

.Env file.

Работает с Docker-Compose.yml. Вы можете просто использовать $-нотацию в вашем составном файле, чтобы выбрать значение с .env, если оба Docker-Compose.yml и .env в том же каталоге

.env выглядит что-то вроде этого

first_variable=a
second_variable=b

Пара ключа-значения используется в Docker-Compose.yml, просто используя $-нотацию в файле docker-compose.yml. Давайте посмотрим и пример.

services:
  demo:
    image: linuxserver/demo
      environment:
        - env_var_name=${first_variable}    # here it is


1. Чтобы проверить, работает нормально в Docker-Compose.yml, вы можете просто использовать Configpout Docker-Compose, таким образом, вы можете проверить, как ваш Docker-Compose.yml будет смотреть после замены значений от .env
2. Существует глюк, переменная окружающей среды в хост-машине может переопределить переменную в вашем файле .env

Различные типы переменных в DockerFile

Arg: Arg: Arg также известен как переменная времени сборки, доступность доступность в тот момент, когда они объявлены в DockerFile до момента сборки докера. Несколько похоже на CMD и EntryPoint, которая сообщает контейнер, что для запуска по умолчанию. Если вы сообщите DockerFile, чтобы ожидать различные переменные ARG (без значения по умолчанию), но не предоставляется при запуске команды сборки, появится сообщение об ошибке

ENV: ENV доступны во время выполнения, вы также можете переопределить их во время выполнения.

Как использовать переменные ARG

Так что, если у вас есть DockerFile, и если вы хотите их установить? Вы можете установить их пустым или оставить значение по умолчанию, и вы можете переопределить их во время сборки Docker.

FROM ubuntu:18.04
ARG any_default_variable
# or with a hard-coded default:
#ARG any_default_variable=any_default_value

RUN echo "Hi $any_default_variable"
# you could also use braces - ${any_default_variable}


Вы можете использовать команду Docker Build, чтобы отправить сборку Args

docker build -t demo --build-arg any_default_variable=yash  .

Вышеуказанная команда будет создавать следующий вывод

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:18.04
 ---> ccc6e87d482b
Step 2/3 : ARG any_default_variable
 ---> Running in ec62ad011b88
Removing intermediate container ec62ad011b88
 ---> 3d8df126a04c
Step 3/3 : RUN echo "Hi $any_default_variable"
 ---> Running in e9f5fb20897e
Hi yash
Removing intermediate container e9f5fb20897e
 ---> d6fe8d6e0f9a
Successfully built d6fe8d6e0f9a
Successfully tagged demo:latest

Как использовать переменные ENV

Переменные ENV также доступны во время сборки, как только вы познакомите их с инструкцией ENV. Однако в отличие от ARG, они также доступны контейнерами, запущенными с окончательного изображения. Значения Env могут быть переопределены при запуске контейнера

Настройка переменных ENV

Вы можете сделать это при запуске ваших контейнеров, но вы также можете обеспечить значения ENV по умолчанию непосредственно в вашем DockerFile Hard-Coding их. Кроме того, вы можете установить динамические значения по умолчанию для переменных среды!

При создании изображения, единственное, что вы можете предоставить, являются значениями ARG, как описано выше. Вы не можете предоставлять значения для переменных ENV напрямую. Однако как Arg, и Env могут работать вместе. Вы можете использовать Arg для установки значений по умолчанию Env vars. Вот базовый DockerFile, используя жестко закодированные значения по умолчанию:

# no default value
ENV hey
# a default value
ENV foo /bar
# or ENV foo=/bar

# ENV values can be used during the build
ADD . $foo
# or ADD . ${foo}
# translates to: ADD . /bar

А вот фрагмент для DockerFile, используя динамические значения Env настроек:

# expect a build-time variable
ARG A_VARIABLE
# use the value to set the ENV var default
ENV an_env_var=$A_VARIABLE
# if not overridden, that value of an_env_var will be available to your containers!

Как только изображение будет построено, вы можете запустить контейнеры и предоставлять значения для переменных ENV трех разных способов либо из командной строки, либо с использованием файла Docker-Compose.yml. Все они будут переопределять любые значения env по умолчанию в DockerFile. В отличие от Arg, вы можете пройти все виды переменных окружающей среды к контейнеру. Даже те, которые явно не определены в Dockerfile. Это зависит от вашего приложения, что это сделает все, однако.

1. Обеспечить значения один за другим

Из командной строки используйте флаг -Э:

docker run -e "env_var_name=another_value" alpine env

2. Передать значения переменной среды от вашего хоста

Это так же, как вышеуказанный метод. Единственное отличие в том, что вы не предоставляете значение, но имейте имя переменной. Это сделает Docker получить доступ к текущему значению в хост-среде и передавать его на контейнер.

docker run -e env_var_name alpine env

3. Принимать значения из файла (env_file)

Файл называется env_file_name (имя произвольно) и он расположен в текущем каталоге. Вы можете ссылаться на имя файла, которое анализируется для извлечения переменных среды для установки:

docker run --env-file=env_file_name alpine env

Если вы новичок в Docker и не используете изображения о изображений и контейнеров: если вы пытаетесь установить значение переменной среды изнутри запускающую оператор, такую как Run Export && …, у вас не будет доступа к нему любое из следующих заявлений за пробегом. Причина этого, заключается в том, что для каждого запуска запускается новый контейнер с промежуточного изображения. Изображение сохраняется к концу команды, но переменные среды не сохраняются таким образом.

Если вам интересно изображение, и хотели бы знать, предоставляет ли он значения вариабельных значений по умолчанию до начала контейнера, вы можете проверить изображения и увидеть, какие записи EVV устанавливаются по умолчанию:

# first, get the images on your system and their ids
$ docker images
# use one of those ids to take a closer look
$ docker inspect image-id

# look out for the "Env" entries

Заключение

К настоящему времени у вас должен быть действительно хороший обзор аргументов постройки, переменные среды, Env_Files и Docker-Copose шаблон с файлами .env. Я надеюсь, что вы получили много значений из этого и можете использовать знания, чтобы спасти себя большим количеством ошибок в будущем. Вы должны увидеть их в действии и применить их к своей собственной работе, чтобы по-настоящему сделать их частью вашего инструмента. Лучший способ убедиться, что вы сможете воспользоваться этой информацией, чтобы учиться делать — идти вперед и попробовать некоторые из этих методов

Оригинал: «https://dev.to/yashdevops/puzzled-around-arg-env-and-env-37o5»