¿Cómo definir una variable en un Dockerfile?

155

En mi Dockerfile , me gustaría definir variables que pueda usar más adelante en el Dockerfile .

Conozco las ENVinstrucciones, pero no quiero que estas variables sean variables de entorno.

¿Hay alguna manera de declarar variables en el ámbito de Dockerfile ?

Maxime
fuente
10
puede usar ARG - consulte docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, creo que deberías publicar eso como tu respuesta (aunque sea una publicación antigua; para la posteridad) ya que eso es exactamente lo que está pidiendo OP.
chillido
ARG no define una var que pueda usarse dentro del dockerfile. Tendría que emparejar eso con el comando ENV para obtener lo que está buscando; ARG foo; ENV FOO = $ foo; COPIAR archivo $ foo (perdón por el mal formato, supongo que no es posible hacer bloques de código y líneas múltiples desde un teléfono)
ntwrkguru

Respuestas:

111

Puede usar ARG: consulte https://docs.docker.com/engine/reference/builder/#arg

La ARGinstrucción define una variable que los usuarios pueden pasar en tiempo de compilación al constructor con el docker buildcomando que usa la --build-arg <varname>=<value>bandera. Si un usuario especifica un argumento de compilación que no se definió en el Dockerfile, la compilación genera un error.

lumos0815
fuente
@MargachChris debería ser posible usar las variables para COPY
lumos0815
No parece funcionar para el comando COPY. docs.docker.com/engine/reference/builder/#arg
femibyte
54

Que yo sepa, solo ENVpermite eso, como se menciona en " Reemplazo del entorno "

Las variables de entorno (declaradas con la ENVdeclaración) también se pueden usar en ciertas instrucciones como variables para ser interpretadas por el Dockerfile.

Deben ser variables de entorno para poder ser redeclaradas en cada nuevo contenedor creado para cada línea del Dockerfile docker build.

En otras palabras, esas variables no se interpretan directamente en un Dockerfile, sino en un contenedor creado para una línea Dockerfile, de ahí el uso de la variable de entorno.


Este día, uso ambos ARG( docker 1.10+ ydocker build --build-arg var=value ) y ENV.
Usar ARGsolo significa que su variable es visible en el momento de la compilación, no en el tiempo de ejecución.

Mi Dockerfile generalmente tiene:

ARG var
ENV var=${var}

En su caso, ARGes suficiente: lo uso típicamente para configurar la variable http_proxy, que la construcción de Docker necesita para acceder a Internet en el momento de la construcción.

VonC
fuente
51

Para responder tu pregunta:

En mi Dockerfile, me gustaría definir variables que pueda usar más adelante en el Dockerfile.

Puede definir una variable con:

ARG myvalue=3

No se permiten espacios alrededor del carácter igual.

Y úsalo más tarde con:

RUN echo $myvalue > /test
Ortomala Lokni
fuente
13

Si la variable se reutiliza dentro de la misma RUNinstrucción, uno simplemente podría establecer una variable de shell. Realmente me gusta cómo abordaron esto con el archivo oficial Ruby Docker .

Evgeny Chernyavskiy
fuente
Gran respuesta. Si bien debe usar ARG si es posible, a veces necesita asignar y reutilizar una variable dinámica. Ejemplo:RUN foo=$(date) && echo $foo
wisbucky
3

Puede usar ARG variable defaultValuey durante el comando de ejecución puede incluso actualizar este valor usando --build-arg variable=value. Para usar estas variables en el archivo acoplable, puede referirlas como $variableen el comando de ejecución.

Nota: Estas variables estarían disponibles para comandos de Linux como RUN echo $variabley no persistirían en la imagen.

usuario2719152
fuente