Docker — это платформа с открытым исходным кодом для контейнеризации, позволяющая легко упаковывать, развертывать и масштабировать приложения. Он использует легкие изолированные контейнеры для обеспечения согласованности и переносимости в различных средах.

По сути, мы собираемся хранить изображение для нашего кода внутри контейнера докеров, и, как и во многих приложениях, нам нужно установить переменные среды, такие как API_KEYS, URL-адреса и т. д.

Как установить переменные ENV в докере?

Прежде всего, давайте создадим пример приложения. Создайте папку и внутри нее создайте файл test.sh с таким кодом:

#!/bin/sh

echo The VAR1 is: $env1

Это должно быть так:

Здесь мы в основном создаем код, который регистрирует в консоли (командой echo) строку с переменной окружения env1.

Теперь давайте создадим наш Dockerfile с помощью этого кода:

FROM alpine:latest

ENV env1 = env_var_example_1

COPY . .

RUN chmod +x /test.sh

CMD ["/test.sh"]

Здесь мы создаем наш образ Docker из последней версии alpine, а затем устанавливаем env1в качестве переменной среды с помощью env_var_example_1 значение.

Теперь нашему образу должна быть назначена переменная ENV при запуске внутри контейнера.

Создайте образ

Чтобы собрать наш образ, нам нужно выполнить эту команду в терминале в папке, которую мы создали ранее:

docker build -t env_test .

Запустите образ

Теперь давайте запустим наш образ. Если мы сделали все шаги правильно, то должны увидеть в консоли лог с надписью «The VAR1 is: = env_var_example_1».

Чтобы запустить образ, нам просто нужно выполнить эту команду:

docker run env_test

И мы должны увидеть это в консоли:

Наконец, мы установили значение ENV в нашем Dockerfile, но, вероятно, мы хотим присвоить значения переменной среды без изменения Dockerfile.

Установите значение ENV через командную строку

Другой способ установки переменных ENV — в командной строке при создании контейнера для образа. Нам просто нужно выполнить эту команду для запуска контейнера:

docker run --name [contianer_name] -e ["env_name=env_value"] [image_name]

Итак, в этом случае будет:

docker run --name test_env_container -e "env1=test1" env_test

Теперь мы можем видеть, как для переменной ENV env1 установлено значение test1.

В этом случае мы фактически заменили переменную ENV, которую установили в Dockerfile с предыдущего шага.

Использовать АРГ

Другой способ сделать это — использовать значения ARG, это переменные, которые сохраняются во время сборки образа Docker, поэтому мы могли бы сделать что-то вроде этого:

Прежде всего, нам нужно изменить Dockerfile, добавив это значение env1ArgARG, а затем назначить его env1.

FROM alpine:latest

ARG env1Arg

ENV env1 = $env1Arg

COPY . .

RUN chmod +x /test.sh

CMD ["/test.sh"]

После этого нам просто нужно выполнить следующую команду, чтобы создать образ и установить значение ARG, и, как следствие, получить набор env1 с этим новым значением.

docker build -t test_env_arg --build-arg env1Arg=new_value .

Теперь наш новый образ создан. Запустим:

docker run test_env_arg

Как мы видим, для переменной env1 установлено значение ARG env1Arg на основе значения, которое мы выбрали в командной строке при создании образа (в данном случае: new_value).

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

Используйте env-файл

Последняя возможность, и, на мой взгляд, лучшая, это иметь файл с переменными env и их значениями. Этот файл переопределит переменные env контейнера.

Давайте напишем этот код внутри нашего test.sh:

#!/bin/sh

echo The VAR1 is: $env1
echo The VAR2 is: $env2
echo The VAR3 is: $env3

И наш Dockerfile:

FROM alpine:latest

COPY . .

RUN chmod +x /test.sh

CMD ["/test.sh"]

Как мы видим, мы не добавляем ни одной переменной ENV в Dockerfile, а в файле test.sh собираемся логировать в консоли значение 3-х переменных ENV.

Теперь создадим образ:

docker build -t env_with_file .

Здесь мы создали образ Docker с именем env_with_file.

Теперь давайте создадим файл env с переменными и их значениями, для этого нам просто нужно создать файл в той же папке нашего проекта, мы можем назвать файл .env, и внутри него напишите это:

env1=value1
env2=value2
env3=value3

Теперь нам просто нужно запустить образ в контейнере, заставив контейнер использовать переменные ENV из созданного нами файла, для этого нам нужно выполнить эту команду:

docker run --name [container-name] --env-file [path-to-env-file] [image-name]

В нашем случае должно быть так:

docker run --name env_with_file_container --env-file .env env_with_file

Также мы можем проверить наш контейнер с помощью этой команды:

docker container inspect [container-name-or-id]

В нашем случае должно быть:

docker container inspect env_with_file_container

И мы увидим информацию о контейнере в консоли, включая переменные ENV:

Заключение

В заключение этого урока я оставлю некоторые из команд, которые мы использовали, и то, что они делают:

Создайте образ Docker с имя:

docker build -t [image-name] .

Создайте образ Docker, как и раньше, но теперь передайте ему несколько значений ARG:

docker build -t [image-name] --build-arg [arg-variable]=[value] .

Запустите образ Docker в случайном контейнере.

docker run [image_name]

Запустите образ Docker с задайте имя контейнера и передайте значения ENV:

docker run --name [contianer_name] -e ["env_name=env_value"] [image_name]

Запустите образ Docker, как и раньше, но теперь передайте файл ENV.

docker run - name [container-name] - env-file [path-to-env-file] [image-name]

Проверьте контейнер Docker:

docker container inspect [container-name-or-id]