Разверните переменную среды внутри контейнера в командной строке Docker - PullRequest
0 голосов
/ 19 сентября 2019

Предположим, что я создаю Dockerfile, который просто запускает команду echo:

FROM alpine
ENTRYPOINT [ "echo" ]

и создаю ее так:

docker build -t my_echo .

Если я запускаю docker run --rm my_echo test он выдаст test, как и ожидалось.

Но как мне запустить команду для отображения переменной среды, которая внутри контейнера?

Пример:

docker run --rm --env MYVAR=foo my_echo ???

Как получить доступ к переменной $MYVAR в контейнере для отображения foo, заменив ???часть этой команды?


Примечание: Это упрощенная версия моего реального варианта использования.Мой реальный вариант использования - это образ Docker WP-CLI , который я создал с помощью файла Dockerfile.В качестве ENTRYPOINT используется команда wp-cli.

Я пытаюсь запустить контейнер на основе этого изображения, чтобы обновить параметр WordPress с помощью переменной среды.Моя команда без Docker: wp-cli option update siteurl "http://example.com", где http://example.com будет в переменной среды.

Это команда, которую я пытаюсь выполнить ( wp_cli - это имя моего контейнера):

docker run --rm --env WEBSITE_URL="http://example.com" wp_cli option update siteurl ???

1 Ответ

1 голос
/ 19 сентября 2019

возможно иметь аргумент, следующий непосредственно за ["bash", "-c"], сам по себе сценарий оболочки, который ищет сигилы для замены.Например, рассмотрим следующий скрипт, который я собираюсь назвать argEnvSubst:

#!/usr/bin/env bash
args=( "$@" )                           # collect all arguments into a single array
for idx in "${!args[@]}"; do            # iterate over the indices of that array...
  arg=${args[$idx]}                     # ...and collect the associated values.
  if [[ $arg =~ ^@ENV[.](.*)@$ ]]; then # if we have a value that matches a pattern...
    varname=${BASH_REMATCH[1]}          # extract the variable name from that pattern
    args[$idx]=${!varname}              # and replace the value with a lookup result
  fi
done
exec "${args[@]}"                       # run our resulting array as a command.

Таким образом, argEnvSubst "echo" "@ENV.foobar@" заменит @ENV.foobar@ значением среды с именем foobar перед ним.вызывает echo.


Хотя я настоятельно рекомендую внедрить это в ваш Dockerfile в качестве отдельного скрипта и назвать этот скрипт как вашу ENTRYPOINT, возможно сделать это в строке:

ENTRYPOINT [ "bash", "-c", "args=(\"$@\"); for idx in \"${!args[@]}\"; do arg=${args[$idx]}; if [[ $arg =~ ^@ENV[.](.*)@$ ]]; then varname=${BASH_REMATCH[1]}; args[$idx]=${!varname}; fi; done; \"${args[@]}\"", "_" ]

... таким образом, что вы можете затем вызвать:

docker run --rm --env WEBSITE_URL="http://example.com" \
       wp_cli option update siteurl '@ENV.WEBSITE_URL@'

Обратите внимание на использование bash - это означает, что alpine (с предоставлением только тире) isn 'т достаточно.

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