Ya no necesitas indagar más por otras webs ya que llegaste al espacio indicado, poseemos la respuesta que necesitas hallar sin complicarte.
Solución:
ARG
es para configurar las variables de entorno que se utilizan durante la docker build
proceso: no están presentes en la imagen final, por lo que no los ve cuando usa docker run
.
Tu usas ARG
para configuraciones que solo son relevantes cuando se está construyendo la imagen y no son necesarias para los contenedores que ejecuta desde la imagen. Puedes usar ENV
para que las variables de entorno se utilicen durante la compilación y en los contenedores.
Con este Dockerfile:
FROM ubuntu
ARG BUILD_TIME=abc
ENV RUN_TIME=123
RUN touch /env.txt
RUN printenv > /env.txt
Puede anular el argumento de compilación como lo ha hecho con docker build -t temp --build-arg BUILD_TIME=def .
. Entonces obtienes lo que esperas:
> docker run temp cat /env.txt
HOSTNAME=b18b9cafe0e0
RUN_TIME=123
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
BUILD_TIME=def
PWD=/
Resumiré los aspectos más destacados de este gran artículo.
ARG Vs ENV
1) Breve explicación:
ARG solo está disponible durante la compilación de una imagen de Docker (RUN, etc.), no después de que se crea la imagen y se inician los contenedores desde ella (ENTRYPOINT, CMD).
ENV los valores están disponibles para los contenedores, pero también los comandos de estilo RUN durante la compilación de Docker comenzando con la línea donde se introducen. Si configura una variable de entorno en un contenedor intermedio usando bash (RUN export VARI = 5 &&…) no persistirá en el siguiente comando.
2) Explicación más larga:
ARG también se conocen como variables de tiempo de compilación. Solo están disponibles desde el momento en que se ‘anuncian’ en el Dockerfile con una instrucción ARG hasta el momento en que se crea la imagen. Los contenedores en ejecución no pueden acceder a los valores de las variables ARG. Esto también se aplica a las instrucciones CMD y ENTRYPOINT que solo indican qué debe ejecutarse el contenedor de forma predeterminada. Si le dice a un Dockerfile que espere varias variables ARG (sin un valor predeterminado) pero no se proporciona ninguna al ejecutar el comando de compilación, aparecerá un mensaje de error.
Sin embargo, los valores ARG se pueden inspeccionar fácilmente después de crear una imagen, al ver el historial de la ventana acoplable de una imagen. Por lo tanto, son una mala elección para datos sensibles.
ENV Las variables también están disponibles durante la compilación, tan pronto como las introduzca con una instrucción ENV. Sin embargo, a diferencia de ARG, también son accesibles mediante contenedores que parten de la imagen final. Los valores de ENV se pueden anular al iniciar un contenedor, más sobre eso a continuación.
3) Con diagrem:
A continuación, se ofrece una descripción general simplificada de las disponibilidades de ARG y ENV en torno al proceso de creación de una imagen de Docker a partir de un Dockerfile y ejecución de un contenedor.
Se superponen, pero ARG no se puede utilizar desde el interior de los contenedores.
Configuración de valores ARG y ENV
Configuración de valores ARG
Entonces, tienes tu Dockerfile
, que define ARG
y ENV
valores. ¿Cómo configurarlos y dónde? Puede dejarlos en blanco en el Dockerfile
o establecer valores predeterminados. Si no proporciona un valor a las variables ARG esperadas que no tienen un valor predeterminado, recibirá un mensaje de error.
Aquí hay un Dockerfile
ejemplo, tanto para valores predeterminados como sin ellos:
ARG some_variable_name
# or with a hard-coded default:
#ARG some_variable_name=default_value
RUN echo "Oh dang look at that $some_variable_name"
# you could also use braces - $some_variable_name
Al crear una imagen de Docker desde la línea de comandos, puede configurar ARG
valores usando –build-arg
:
$ docker build --build-arg some_variable_name=a_value
Ejecutando ese comando, con lo anterior Dockerfile
, dará como resultado la impresión de la siguiente línea (entre otras): Oh maldición, mira ese a_value
Entonces, ¿cómo se traduce esto en usar docker-compose.yml
archivos?
Al usar docker-compose, puede especificar valores para transmitir ARG
, en un bloque de argumentos:
(archivo docker-compose.yml)
version: '3'
services:
somename:
build:
context: ./app
dockerfile: Dockerfile
args:
some_variable_name: a_value
Cuando intenta establecer una variable que no es ARG
mencionado en el Dockerfile
, Docker se quejará.
Configuración de valores ENV
Entonces, ¿cómo configurar ENV
¿valores? Puede hacerlo al iniciar sus contenedores (y veremos esto un poco a continuación), pero también puede proporcionar valores predeterminados ENV
valores directamente en su Dockerfile
codificándolos. Además, puede establecer valores predeterminados dinámicos para las variables de entorno.
Al crear una imagen, lo único que puede proporcionar es ARG
valores, como se describe arriba. No puedes proporcionar valores para ENV
variables directamente. Sin embargo, ambos ARG
y ENV
pueden trabajar juntos. Puede utilizar ARG para establecer los valores predeterminados de ENV
vars.
Aquí hay un básico Dockerfile
, utilizando valores predeterminados codificados de forma rígida:
# no default value
ENV hey
# a default value
ENV foo /bar
# or ENV foo=/bar
# ENV values can be used during the build
ADD . $foo
# or ADD . $foo
# translates to: ADD . /bar
Y aquí hay un fragmento de Dockerfile
, usando valores env dinámicos en construcción:
# expect a build-time variable
ARG A_VARIABLE
# use the value to set the ENV var default
ENV an_env_var=$A_VARIABLE
# if not overridden, that value of an_env_var will be available to your containers!
Una vez creada la imagen, puede lanzar contenedores y proporcionar valores para ENV
variables de tres formas diferentes, ya sea desde la línea de comando o utilizando un docker-compose.yml
expediente.
Todos ellos anularán cualquier defecto ENV
valores en el Dockerfile
.
diferente a ARG
, puede pasar todo tipo de variables de entorno al contenedor. Incluso aquellos no definidos explícitamente en el Dockerfile
.
Sin embargo, depende de su aplicación si eso hará algo.
Opción 1: proporcione los valores uno por uno
Desde la línea de comandos, use la bandera -e:
$ docker run -e "env_var_name=another_value" alpine env
A partir de una docker-compose.yml
expediente:
version: '3'
services:
plex:
image: linuxserver/plex
environment:
- env_var_name=another_value
Opción 2: pasar valores de variables de entorno desde su host
Es el mismo que el método anterior.
La única diferencia es que no proporciona un valor, solo nombra la variable. Esto hará que Docker acceda al valor actual en el entorno del host y lo pase al contenedor.
$ docker run -e env_var_name alpine env
Para el docker-compose.yml
archivo, omita el signo de la ecuación y todo lo que le sigue para obtener el mismo efecto.
version: '3'
services:
plex:
image: linuxserver/plex
environment:
- env_var_name
Opción 3: tomar valores de un archivo (env_file)
En lugar de escribir las variables o codificarlas (no es de buen gusto según la gente de 12 factores), podemos especificar un archivo para leer los valores. El contenido de dicho archivo se parece a esto:
env_var_name=another_value
El archivo de arriba se llama env_file_name (nombre arbitrario) y está ubicado en el directorio actual.
Puede hacer referencia al nombre del archivo, que se analiza para extraer las variables de entorno para establecer:
$ docker run --env-file=env_file_name alpine env
Con docker-compose.yml
files, solo hacemos referencia a un env_file, y Docker lo analiza en busca de las variables para establecer.
version: '3'
services:
plex:
image: linuxserver/plex
env_file: env_file_name
Formas comunes de configurar ARG y ENV desde la línea de comando
Aquí hay una pequeña hoja de trucos, que combina una descripción general de ARG
y ENV
disponibilidad con formas comunes de configurarlos desde la línea de comandos.
Calificaciones y comentarios
Si te mola la idea, tienes la libertad de dejar un tutorial acerca de qué te ha impresionado de este enunciado.