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]