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]