¿Es posible establecer una variable ENV de la ventana acoplable como 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
dockerfile
env
Sultanen
fuente
fuente
Respuestas:
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:
Esto se ejecuta en un solo contenedor.
fuente
$bleah
está disponible en ningún lugar fuera de este comando RUN, ni siquiera en la siguiente línea en el mismo archivo docker, y mucho menos en otra imagen en la que se basa. Una característica realmente obvia que falta en la ventana acoplable aquí, parece que escribir y leer en un archivo es la única forma de almacenar realmente variables (dinámicas) en imágenes y pasarlas entre imágenes, lo que parece súper hacky.Tuve el mismo problema y encontré la manera de establecer la variable de entorno como resultado de la función usando el comando RUN en dockerfile.
Por ejemplo, necesito configurar SECRET_KEY_BASE para la aplicación Rails solo una vez sin cambiar como lo haría cuando ejecuto:
En su lugar, escribo en la cadena Dockerfile como:
y mi variable env disponible desde la raíz, incluso después de iniciar sesión en bash. o tal vez
luego variable disponible en los comandos CMD y ENTRYPOINT
Docker lo almacena en caché como capa y solo lo cambia si cambia algunas cadenas antes.
También puede probar diferentes formas de establecer la variable de entorno.
fuente
*.sh
archivo en el interior/etc/profile.d/
se utiliza para poblar el entornoEn este momento, el resultado de un comando se puede usar con
RUN export
, pero no se puede asignar a unENV
variable.Problema conocido: https://github.com/docker/docker/issues/29110
fuente
Esta respuesta es una respuesta a @DarkSideF ,
El método que propone es el siguiente, en
Dockerfile
:( agregando una exportación en el
/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
se ignorará por completo y su aplicación no tendrá ni idea de quéSECRET_KEY_BASE
es al intentar accederprocess.env.SECRET_KEY_BASE
.Esa es la razón por la que la
ENV
palabra clave es lo que todos intentan usar con un comando dinámico porque cada vez que ejecuta su contenedor o usa unexec
comando, Docker verificaráENV
y canalizará todos los valores en el proceso que se ejecuta actualmente (similar a-e
).Una solución es usar un contenedor (crédito a @duglin en este número de github ). Tenga un archivo contenedor (por ejemplo
envwrapper
) en la raíz de su proyecto que contenga:y luego en tu
Dockerfile
:fuente
Como una adición a la respuesta de @ DarkSideF, si desea reutilizar el resultado de un comando anterior en su
Dockerfile
durante el proceso de compilación , puede usar la siguiente solución:Por ejemplo :
Para algo más limpio, puede usar también la siguiente esencia que proporciona una pequeña CLI llamada
envstore.py
:O puede usar la biblioteca python-dotenv que tiene una CLI similar.
fuente
No estoy seguro de si esto es lo que estaba buscando, pero para inyectar ENV vars o ARGS en su .Dockerfile, este patrón funciona.
en su my_build.sh:
para obtener un ARG en su .Dockerfile, el fragmento podría verse así:
alternativamente, para obtener un ENV en su .Dockerfile, el fragmento podría verse así:
la idea es ejecutar el script de shell y eso llama al .Dockerfile con los argumentos pasados como opciones en la compilación.
fuente