Crear variables de entorno dinámicas en tiempo de compilación en Docker
Mi caso de uso específico es que quiero organizar algunos datos sobre la instancia EC2 en la que se está ejecutando un contenedor y hacer que esté disponible como una variable de entorno. Me gustaría hacer esto cuando el contenedor esté construido.
Esperaba poder hacer algo como ENV VAR_NAME $(./script/that/gets/var)
en mi Dockerfile, pero como era de esperar eso no funciona (solo obtienes la cadena $(./script...
).
Debo mencionar que sé que el docker run --env...
hará esto, pero específicamente quiero que se integre en el contenedor.
¿Me estoy perdiendo algo obvio? ¿Es esto posible?
3 answers
Docker v1. 9 o posterior
Si está utilizando Docker v1.9 o posterior, esto es posible a través del soporte para argumentos de tiempo de compilación. Los argumentos se declaran en Dockerfile
por usando la instrucción ARG.
ARG REQUIRED_ARGUMENT
ARG OPTIONAL_ARGUMENT=default_value
Cuando más tarde construya su imagen usando docker build
puede pasar argumentos a través de la bandera --build-arg
como se describe en la docker docs.
$ docker build --build-arg REQUIRED_ARGUMENT=this-is-required .
Tenga en cuenta que se recomienda no usar variables de tiempo de compilación para contraseñas o secretos como claves o credenciales.
Además, las variables en tiempo de compilación pueden tener un gran impacto en el almacenamiento en caché. Por lo tanto, el Dockerfile debe construirse con mucho cuidado para poder utilizar el almacenamiento en caché tanto como sea posible y así acelerar el proceso de construcción.
Editar: la parte"acoplable más nueva que la v1.9" se agregó después de la entrada desde leedm777:s answer.
Docker antes de v1.9
Si está utilizando un Docker-versión anterior a la 1.9,ARG
/--build-arg
el enfoque no era posible. No pudo resolver este tipo de información durante la compilación, por lo que tuvo que pasarlos como parámetros al comando docker run
.
Docker las imágenes deben ser consistentes a lo largo del tiempo, mientras que los contenedores se pueden ajustar y considerar como "procesos de desecho".
- Más información sobre ENV
- Una discusión en docker sobre compilaciones dinámicas
La antigua solución a esto el problema era usar plantillas. Esta no es una solución clara, pero era una de las pocas opciones viables en ese momento. (Inspiración de esta discusión ).
- guarde todos sus datos dinámicos en un archivo json o yaml
- crear un archivo docker "plantilla" donde la dinámica puede ser expandida posteriormente
- escriba un script que cree un Dockerfile a partir de los datos de configuración utilizando alguna biblioteca de plantillas con la que esté familiarizado
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:22
Docker 1.9 ha añadido soporte para argumentos de tiempo de compilación.
En su Dockerfile
, usted agrega una instrucción ARG
, que tiene una sintaxis similar a ENV
.
ARG FOO_REQUIRED
ARG BAR_OPTIONAL=something
En el momento de la compilación, puede pasar pasar un argumento --build-arg
para establecer el argumento para esa compilación. Debe especificarse cualquier ARG
al que no se le haya dado un valor predeterminado en el Dockerfile
.
$ docker build --build-arg FOO_REQUIRED=best-foo-ever .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-01 16:35:37
Para compilar ENV VAR_NAME $(./script/that/gets/var)
en el contenedor, cree un Dockerfile dinámico en el momento de compilar:
$ docker build -t awesome -f Dockerfile .
$ # get VAR_NAME value:
$ VAR_VALUE=`docker run --rm awesome \
bash -c 'echo $(./script/that/gets/var)'`
$ # use dynamic Dockerfile:
$ {
echo "FROM awesome"
echo "ENV VAR_NAME $VAR_VALUE"
} | docker build -t awesome -
Https://github.com/42ua/docker-autobuild/blob/master/emscripten-sdk/README.md#build-docker-image
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-01 00:27:16