возможно иметь аргумент, следующий непосредственно за ["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 'т достаточно.