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 .

Стартирайте изображението

Сега нека стартираме нашето изображение. Ако сме направили всички стъпки правилно, трябва да видим в конзолата лог с „VAR1 е: = 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

Друг начин да направите това е с 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 стойност въз основа на стойността, която сме избрали в команден ред, когато създавате изображението (в този случай: нова_стойност).

Това причинява проблема, че трябва да изградим изображението всеки път, когато искаме да променим стойностите на променливата 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]