¿Cómo definir una variable en un Dockerfile?
En mi Dockerfile, me gustaría definir variables que puedo usar más adelante en el Dockerfile.
Conozco la ENV
instrucción, pero no quiero que estas variables sean variables de entorno.
¿Hay alguna manera de declarar variables en el alcance de Dockerfile?
Puede utilizar ARG
: consulte https://docs.docker.com/engine/reference/builder/#arg
La
ARG
instrucción define una variable que los usuarios pueden pasar en el momento de la compilación al constructor con eldocker build
comando 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> .
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
Que yo sepa, solo ENV
permite eso, como se menciona en " Reemplazo del entorno " .
Las variables de entorno (declaradas con la
ENV
declaració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 ARG
solo 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, ARG
es 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!
LaARG
variable 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
ARG
definició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
USER
línea 2 se evalúasome_user
como la variable de usuario se define en la línea 3 posterior.
LaUSER
línea 4 se evalúa comowhat_user
se define el usuario y elwhat_user
valor se pasó en la línea de comando.
Antes de su definición mediante unaARG
instrucción, cualquier uso de una variable da como resultado una cadena vacía.Una
ARG
instrucció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 laARG
instrucción.
Si la variable se reutiliza dentro de la misma RUN
instrucción, simplemente se podría establecer una variable de shell. Realmente me gusta cómo abordaron esto con el Ruby Dockerfile oficial .