É possível definir uma variável docker ENV para o resultado de um comando? Gostar:
ENV MY_VAR whoami
eu quero que MY_VAR obtenha o valor "root" ou o que quer que whoami retorne
dockerfile
env
Sultanen
fonte
fonte
Respostas:
Como um complemento à resposta DarkSideF.
Você deve estar ciente de que cada linha / comando no Dockerfile é executado em outro contêiner.
Você pode fazer algo assim:
Isso é executado em um único contêiner.
fonte
$bleah
está disponível em nenhum lugar fora deste comando RUN, nem mesmo na próxima linha no mesmo dockerfile, muito menos em outra imagem em que se baseia. Recurso ausente realmente óbvio do docker aqui, parece que escrever e ler de um arquivo é a única maneira de realmente armazenar variáveis (dinâmicas) em imagens e passá-las entre imagens, o que parece super hacky.Eu tive o mesmo problema e encontrei uma maneira de definir a variável de ambiente como resultado da função usando o comando RUN no dockerfile.
Por exemplo, eu preciso definir SECRET_KEY_BASE para o aplicativo Rails apenas uma vez, sem alterar como faria quando eu executo:
Em vez disso, escrevo na string do Dockerfile como:
e minha variável env disponível a partir do root, mesmo após o login do bash. ou talvez
então ele variável disponível nos comandos CMD e ENTRYPOINT
O Docker armazena em cache como camada e muda apenas se você alterar algumas strings antes dele.
Você também pode tentar maneiras diferentes de definir a variável de ambiente.
fonte
*.sh
arquivo dentro/etc/profile.d/
é usado paraNeste momento, um resultado de comando pode ser usado com
RUN export
, mas não pode ser atribuído a umaENV
variável.Problema conhecido: https://github.com/docker/docker/issues/29110
fonte
Esta resposta é uma resposta a @DarkSideF ,
O método que ele está propondo é o seguinte, em
Dockerfile
:( adicionando uma exportação no
/etc/bash.bashrc
)É bom, mas a variável de ambiente só estará disponível para o processo
/bin/bash
, e se você tentar executar seu aplicativo docker, por exemplo, um aplicativo Node.js,/etc/bash.bashrc
será completamente ignorado e seu aplicativo não terá uma única pista do queSECRET_KEY_BASE
está ao tentar para acessarprocess.env.SECRET_KEY_BASE
.Essa é a razão pela qual
ENV
palavra-chave é o que todos estão tentando usar com um comando dinâmico, porque toda vez que você executa seu contêiner ou usa umexec
comando, o Docker verificaENV
e canaliza cada valor no processo executado atualmente (semelhante a-e
).Uma solução é usar um wrapper (crédito para @duglin neste problema do github ). Tenha um arquivo wrapper (por exemplo
envwrapper
) na raiz do projeto contendo:e então em seu
Dockerfile
:fonte
Além da resposta de @ DarkSideF, se quiser reutilizar o resultado de um comando anterior
Dockerfile
durante o processo de compilação , você pode usar a seguinte solução alternativa:Por exemplo :
Para algo mais limpo, você também pode usar a seguinte essência, que fornece uma pequena CLI chamada
envstore.py
:Ou você pode usar a biblioteca python-dotenv que possui uma CLI semelhante.
fonte
Não tenho certeza se é isso que você estava procurando, mas para injetar ENV vars ou ARGS em seu .Dockerfile, esse padrão funciona.
em seu my_build.sh:
para obter um ARG em seu .Dockerfile, o snippet pode ter a seguinte aparência:
como alternativa, para obter um ENV em seu .Dockerfile, o snippet pode ter a seguinte aparência:
a ideia é que você execute o script de shell e isso chama o .Dockerfile com os args passados como opções na construção.
fonte