Como definir uma variável em um Dockerfile?

155

No meu Dockerfile , gostaria de definir variáveis que eu possa usar posteriormente no Dockerfile .

Estou ciente da ENVinstrução, mas não quero que essas variáveis ​​sejam variáveis ​​de ambiente.

Existe uma maneira de declarar variáveis ​​no escopo do Dockerfile ?

Maxime
fonte
10
você pode usar ARG - ver docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, acho que você deve postar isso como sua resposta (mesmo que seja um post antigo; para a posteridade), pois é exatamente isso que o OP está pedindo.
gritou
O ARG não define um var que possa ser usado no dockerfile. Você precisaria combinar isso com o comando ENV para obter o que estava procurando; ARG foo; ENV FOO = $ foo; Cópia de arquivo $ foo (desculpem a má formatação, eu acho que não é possível fazer blocos de código e de multi linha de um telefone)
ntwrkguru

Respostas:

111

Você pode usar ARG- consulte https://docs.docker.com/engine/reference/builder/#arg

A ARGinstrução define uma variável que os usuários podem transmitir no momento da construção para o construtor com o docker buildcomando usando o --build-arg <varname>=<value>sinalizador Se um usuário especificar um argumento de construção que não foi definido no Dockerfile, a construção emitirá um erro.

lumos0815
fonte
@MargachChris deve ser possível usar as variáveis para COPY
lumos0815
Parece não funcionar para o comando COPY. docs.docker.com/engine/reference/builder/#arg
femibyte
54

Que eu saiba, apenas ENVpermite que, conforme mencionado em " Substituição do ambiente "

As variáveis ​​de ambiente (declaradas com a ENVinstrução) também podem ser usadas em determinadas instruções como variáveis ​​a serem interpretadas pelo Dockerfile.

Eles precisam ser variáveis ​​de ambiente para serem redeclarados em cada novo contêiner criado para cada linha do Dockerfile docker build.

Em outras palavras, essas variáveis ​​não são interpretadas diretamente em um Dockerfile, mas em um contêiner criado para uma linha Dockerfile, daí o uso da variável de ambiente.


Neste dia, eu uso os dois ARG( docker 1.10+ edocker build --build-arg var=value ) e ENV.
Usar ARGsozinho significa que sua variável é visível no tempo de construção, não no tempo de execução.

Meu Dockerfile geralmente possui:

ARG var
ENV var=${var}

No seu caso, ARGbasta: eu o uso normalmente para definir a variável http_proxy, para que a construção do docker precise acessar a Internet no momento da construção.

VonC
fonte
51

Para responder sua pergunta:

No meu Dockerfile, gostaria de definir variáveis ​​que eu possa usar posteriormente no Dockerfile.

Você pode definir uma variável com:

ARG myvalue=3

Espaços em torno do caractere igual não são permitidos.

E use-o mais tarde com:

RUN echo $myvalue > /test
Ortomala Lokni
fonte
13

Se a variável for reutilizada dentro da mesma RUNinstrução, pode-se simplesmente definir uma variável shell. Eu realmente gosto de como eles abordaram isso com o Ruby Dockerfile oficial .

Evgeny Chernyavskiy
fonte
Ótima resposta. Embora você deva usar o ARG, se possível, às vezes você precisa atribuir e reutilizar uma variável dinâmica. Exemplo:RUN foo=$(date) && echo $foo
wisbucky 11/07/19
3

Você pode usar ARG variable defaultValuee, durante o comando executar, pode atualizar esse valor usando --build-arg variable=value. Para usar essas variáveis ​​no arquivo docker, você pode consultá-las como $variableno comando run.

Nota: Essas variáveis ​​estariam disponíveis para comandos do Linux RUN echo $variablee não persistiriam na imagem.

user2719152
fonte