dockerfile - run - dockers images
Dockerfile: configure ENV como resultado del comando (4)
Como una adición a la respuesta de DarkSideF.
Debe tener en cuenta que cada línea / comando en Dockerfile se ejecuta en otro contenedor.
Puedes hacer algo como esto:
RUN export bleah=$(hostname -f);echo $bleah;
Esto se ejecuta en un solo contenedor.
¿Es posible establecer una variable ENV del acoplador para el resultado de un comando? Me gusta:
ENV MY_VAR whoami
Quiero que MY_VAR obtenga el valor "root" o lo que sea que devuelva whoami
En este momento, un resultado de comando se puede usar con la RUN export
, pero no se puede asignar a una variable ENV
.
Problema conocido: https://github.com/docker/docker/issues/29110
Esta respuesta es una respuesta a @DarkSideF ,
El método que está proponiendo es el siguiente, en Dockerfile
:
RUN bash -l -c ''echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc''
( agregando una exportación en /etc/bash.bashrc
)
Es bueno, pero la variable de entorno solo estará disponible para el proceso /bin/bash
, y si intenta ejecutar su aplicación docker, por ejemplo, una aplicación Node.js, /etc/bash.bashrc
será completamente ignorado y su aplicación ganada No tiene ni idea de qué es SECRET_KEY_BASE
al intentar acceder a process.env.SECRET_KEY_BASE
.
Esa es la razón por la cual la palabra clave ENV
es lo que todos intentan usar con un comando dinámico porque cada vez que ejecuta su contenedor o usa un comando exec
, Docker verificará ENV
y canalizará todos los valores en el proceso actualmente en ejecución (similar a -e
) .
Una solución es usar un contenedor (crédito a @duglin en este problema github ). Tenga un archivo contenedor (por ejemplo, envwrapper
) en la raíz de su proyecto que contenga:
#!/bin/bash
export SECRET_KEY_BASE="$(openssl rand -hex 64)"
export ANOTHER_ENV "hello world"
$*
y luego en tu Dockerfile
:
...
COPY . .
RUN mv envwrapper /bin/.
RUN chmod 755 /bin/envwrapper
CMD envwrapper myapp
Tuve el mismo problema y encontré la forma de establecer la variable de entorno como resultado de la función mediante el uso del comando EJECUTAR en dockerfile.
Por ejemplo, necesito configurar SECRET_KEY_BASE para la aplicación Rails solo una vez sin cambiar, como lo haría cuando ejecutara:
docker run -e SECRET_KEY_BASE="$(openssl rand -hex 64)"
En cambio, escribo en la cadena Dockerfile como:
RUN bash -l -c ''echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc''
y mi variable env disponible desde root, incluso después del inicio de sesión bash. o tal vez
RUN /bin/bash -l -c ''echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" > /etc/profile.d/docker_init.sh''
entonces es variable disponible en los comandos CMD y ENTRYPOINT
Docker lo almacena en caché como capa y lo cambia solo si cambia algunas cadenas antes.
También puede probar diferentes formas de establecer la variable de entorno.