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?

 37
Author: Evan, 2014-12-30

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

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

  1. guarde todos sus datos dinámicos en un archivo json o yaml
  2. crear un archivo docker "plantilla" donde la dinámica puede ser expandida posteriormente
  3. 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
 29
Author: wassgren,
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 .
 30
Author: leedm777,
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

 3
Author: Oleg Mazko,
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