¿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 ?



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


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


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

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 .


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.