Suponha que eu crie um Dockerfile
que apenas executa um echo
comando:
FROM alpine
ENTRYPOINT [ "echo" ]
e que eu construo assim:
docker build -t my_echo .
Se eu executar docker run --rm my_echo test
, a saída será test
conforme o esperado.
Mas como posso executar o comando para exibir uma variável de ambiente que está dentro do contêiner?
Exemplo:
docker run --rm --env MYVAR=foo my_echo ???
Como acessar a $MYVAR
variável que está no container para exibir foo
substituindo o ??? parte desse comando?
Nota: Esta é uma versão simplificada do meu caso de uso real. Meu caso de uso real é uma imagem WP-CLI Docker que construí com um Dockerfile. Possui o wp-cli
comando como ENTRYPOINT.
Estou tentando executar um contêiner com base nesta imagem para atualizar um parâmetro do WordPress com uma variável de ambiente. Meu comando sem Docker é wp-cli option update siteurl "http://example.com"
onde http://example.com
estaria em uma variável de ambiente.
Este é o comando que estou tentando executar ( wp_cli é o nome do meu contêiner):
docker run --rm --env WEBSITE_URL="http://example.com" wp_cli option update siteurl ???
É possível que o argumento que se segue imediatamente ["bash", "-c"]
seja um script de shell que procura sigilos para substituir. Por exemplo, considere o seguinte script, que chamarei de 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.
Portanto, argEnvSubst "echo" "@ENV.foobar@"
irá substituir @ENV.foobar@
pelo valor do ambiente nomeado foobar
antes de ser chamado echo
.
Embora eu recomende fortemente injetar isso em seu Dockerfile como um script separado e nomear esse script como seu ENTRYPOINT, é possível fazer isso in-line:
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[@]}\"", "_" ]
... de modo que você possa invocar:
docker run --rm --env WEBSITE_URL="http://example.com" \
wp_cli option update siteurl '@ENV.WEBSITE_URL@'
Observe que o uso de bash
- isso significa alpine
(fornecer apenas um traço) não é suficiente.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras