Подстановка переменной ENV в Dockerfile в другую переменную ENV - PullRequest
1 голос
/ 21 октября 2019

Я изучаю Docker и сталкиваюсь с проблемой подстановки значения одной переменной env в другую переменную env.

Это мой Dockerfile

FROM ubuntu

ENV var_env=Tarun

ENV command="echo Hello $var_env"

CMD ["sh","-c","echo Hello $var_env"]

Теперь, после создания его с именем тега"exp", тогда

sudo docker run -e  "var_env=New Env Value" exp

Это дает мне правильный вывод как

Hello New Env Value

Но, если я вижу переменные окружения, связанные с выполнением

sudo docker run -e  "var_env=New Env Value" exp env

Itдает мне такой вывод:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=138aa8852d8d
var_env=New Env Value
command=echo Hello Tarun
HOME=/root

В нем значение переменной среды var_env изменяется, а значение переменной среды command остается неизменным.

Мне нужно найти способтак что, если я изменю значение переменной среды var_env с помощью приведенной выше команды, она также обновит значение переменной среды var_env внутри переменной среды command.

Для справки: https://docs.docker.com/engine/reference/builder/#environment-replacement

1 Ответ

0 голосов
/ 21 октября 2019

Вариант 1: при запуске контейнера

Вы можете использовать скрипт-обертку для создания переменных среды с желаемым наследованием. Вот простой скрипт-обертка

wrapper.sh

#!/bin/bash

# prep your environement variables
export command="echo Hello $var_env"

# run your actual command
echo "Hello $var_env"

Ваш файл Docker должен быть адаптирован для его использования

FROM ubuntu
COPY ./wrapper.sh .
ENV var_env=Tarun
ENV command="echo Hello $var_env"
CMD ["sh","-c","./wrapper.sh"]

Вариант 2: во время сборки

Вы можете заархивировать это, перестроив свой образ с разными аргументами сборки. Позволяет сохранить ваш dockerfile почти таким же:

FROM ubuntu
ARG var_env=Tarun
ENV command="echo Hello $var_env"
CMD ["sh","-c","echo Hello $var_env"]

и запустить

docker build -t test .

, это даст вам изображение по умолчанию, как определено в вашем файле docker, но ваш var_env равенбольше не переменная окружения.

затем мы запускаем

docker build -t test --build-arg var_env="New Env Value" .

, это сделает недействительным кэш-память докера только со строки, в которой вы определили свой аргумент сборки. Поэтому держите ваше определение ARG рядом с тем местом, где оно используется, чтобы максимизировать функциональность кэширования при сборке Docker.

Подробнее об аргументах сборки можно узнать здесь: https://docs.docker.com/engine/reference/commandline/build/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...