run - Obtiene el valor de la variable de entorno en Dockerfile
docker-compose (6)
Estoy construyendo un contenedor para una aplicación Ruby. La configuración de mi aplicación está contenida dentro de variables de entorno (cargadas dentro de la aplicación con dotenv ).
Una de esas variables de configuración es la ip pública de la aplicación, que se usa internamente para crear enlaces. Necesito agregar una entrada dnsmasq señalando esta ip a 127.0.0.1 dentro del contenedor, por lo que puede buscar los enlaces de la aplicación como si no estuviera en contenedor.
Por lo tanto, estoy tratando de establecer un ENV
en mi archivo Docker, que pasaría una variable de entorno al contenedor.
Intenté algunas cosas.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Sin embargo, todo pasa la cadena "REQUEST_DOMAIN" en lugar del valor de la variable de entorno. ¿Hay alguna manera de pasar los valores de las variables de entorno de la máquina host al contenedor?
Cargue variables de entorno de un archivo que cree en tiempo de ejecución.
export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF
... luego en el archivo Docker
ADD build /build
RUN /build/test.sh
donde test.sh carga MYVAR desde env.sh
#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile
Debería usar la directiva ARG
en su archivo Docker, que es para este propósito.
La instrucción
ARG
define una variable que los usuarios pueden pasar en el tiempo de compilación al constructor con el comando de compilación docker utilizando el--build-arg <varname>=<value>
.
Entonces tu Dockerfile tendrá esta línea:
ARG request_domain
o si prefieres un valor predeterminado:
ARG request_domain=127.0.0.1
Ahora puede hacer referencia a esta variable dentro de su archivo Docker:
ENV request_domain=$request_domain
entonces construirás tu contenedor así:
$ docker build --build-arg request_domain=mydomain Dockerfile
Nota 1: su imagen no se compilará si ha hecho referencia a un ARG
en su archivo Docker, pero lo ha excluido en --build-arg
.
Nota 2: Si un usuario especifica un argumento de compilación que no se definió en el archivo Docker, la compilación genera una advertencia:
[Advertencia] Uno o más build-args [foo] no fueron consumidos.
Entonces puedes hacer: cat Dockerfile | envsubst | docker build -t my-target -
cat Dockerfile | envsubst | docker build -t my-target -
Luego, tenga un Dockerfile con algo como:
ENV MY_ENV_VAR $MY_ENV_VAR
Supongo que puede haber un problema con algunos caracteres especiales, pero esto funciona para la mayoría de los casos al menos.
Si solo desea buscar y reemplazar todas las variables de entorno ($ ExampleEnvVar) en un Dockerfile y compilarlo, esto funcionaría:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
Una alternativa que utiliza envsubst
sin perder la capacidad de usar comandos como COPY
o ADD
, y sin usar archivos intermedios sería usar la Sustitución de procesos de Bash:
docker build -f <(envsubst < Dockerfile) -t my-target .
NOTA: Originalmente quería agregar un comentario a la respuesta de jonasfj, pero parece que no tengo suficiente reputación.
add -e
clave para pasar variables de entorno al contenedor. ejemplo:
$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID)
$ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash
root@87f235949a13:/# echo $DBIP
172.17.0.2