¿Cómo definir una variable en un Dockerfile?

Resuelto Maxime asked hace 8 años • 7 respuestas

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

Conozco la ENVinstrucción, pero no quiero que estas variables sean variables de entorno.

¿Hay alguna manera de declarar variables en el alcance de Dockerfile?

Maxime avatar Nov 26 '15 17:11 Maxime
Aceptado

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

La ARGinstrucción define una variable que los usuarios pueden pasar en el momento de la compilación al constructor con el docker buildcomando usando 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.

Puede ser útil con COPY durante el tiempo de compilación (por ejemplo, copiar contenido específico de la etiqueta, como carpetas específicas). Por ejemplo:

ARG MODEL_TO_COPY
COPY application ./application
COPY $MODEL_TO_COPY ./application/$MODEL_TO_COPY

Mientras construye el contenedor:

docker build --build-arg MODEL_TO_COPY=model_name -t <container>:<model_name specific tag> .
lumos0815 avatar Jun 05 '2016 08:06 lumos0815

Para responder tu pregunta:

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

Puedes 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 avatar Aug 09 '2018 14:08 Ortomala Lokni

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 Dockerfile.

Tienen que ser variables de entorno para poder volver a declararlas en cada nuevo contenedor creado para cada línea del Dockerfile por docker build.

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


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

Mi Dockerfile suele tener:

ARG var
ENV var=${var}

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


Christopher King agrega en los comentarios :

¡Cuidado!
La ARGvariable solo está dentro del alcance de la "etapa en la que se utiliza" y debe volver a declararse para cada etapa.

Señala a Dockerfile/alcance

Una ARGdefinición de variable entra en vigor desde la línea en la que se define en el Dockerfile, no desde el uso del argumento en la línea de comandos o en otro lugar.

Por ejemplo, considere este Dockerfile:

FROM busybox
USER ${user:-some_user}
ARG user
USER $user
# ...

Un usuario crea este archivo llamando:

docker build --build-arg user=what_user .

La USERlínea 2 se evalúa some_usercomo la variable de usuario se define en la línea 3 posterior.
La USERlínea 4 se evalúa como what_userse define el usuario y el what_uservalor se pasó en la línea de comando.
Antes de su definición mediante una ARGinstrucción, cualquier uso de una variable da como resultado una cadena vacía.

Una ARGinstrucción sale del alcance al final de la etapa de construcción donde se definió.
Para utilizar un argumento en varias etapas, cada etapa debe incluir la ARGinstrucción.

VonC avatar Nov 26 '2015 10:11 VonC

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

Evgeny Chernyavskiy avatar Nov 29 '2015 03:11 Evgeny Chernyavskiy