El prefijo COMPOSE_ hace que Portainer propague variables a los stacks
Un usuario documenta que anteponer COMPOSE_ a las variables de global.env permite que Portainer las inyecte en los stacks, algo que no lograba con nombres normales.
En Portainer, las variables definidas en global.env no llegan a los stacks gestionados si se llaman como uno espera. Un usuario ha encontrado que anteponiendo COMPOSE_ al nombre de cada variable, Portainer las propaga y las deja disponibles dentro de los contenedores. Lo ha comprobado con docker inspect y con un stack de Jellyfin; no hay confirmación oficial ni pruebas exhaustivas.
Qué probó
El escenario: OpenMediaVault como sistema base y Portainer para gestionar contenedores. Las variables se declaran en global.env y luego se pasan al servicio de Portainer en el YAML, dentro de environment. En la primera prueba usó nombres como MAIN_STORAGE, MAIN_ROOT, COMPOSE_ROOT y COMPOSE_DATA. Al inspeccionar un contenedor, las dos que empezaban por COMPOSE_ tenían valor; MAIN_ROOT y MAIN_STORAGE aparecían vacías.
Después repitió la prueba anteponiendo COMPOSE_ a todas: COMPOSE_MAIN_STORAGE, COMPOSE_MAIN_ROOT, COMPOSE_ROOT y COMPOSE_DATA. En esta ocasión las cuatro llegaron al stack. El autor lo resume como un truco poco elegante, pero funcional, y señala que no ha hecho pruebas exhaustivas aunque su stack de Jellyfin sí funciona.
Por qué ocurre
La explicación probable está en el propio código de Portainer. El autor enlaza a un fragmento de composeplugin.go, en las líneas 294 a 298, donde se recorre os.Environ() y solo se añaden a composeEnvVars las variables cuyo nombre empieza por COMPOSE. Eso encaja con lo observado: cualquier variable que no cumpla ese prefijo se queda fuera del entorno que Portainer pasa a los stacks.
El matiz importa porque no es una opción documentada, sino un comportamiento que se deduce del código. El prefijo no es COMPOSE_ necesariamente; el filtro busca COMPOSE, así que el guion bajo solo forma parte del nombre habitual. Tampoco hay confirmación de que esto vaya a mantenerse en futuras versiones.
Para quien autohospeda varios servicios, la utilidad es clara: permite centralizar rutas de almacenamiento y directorios de datos en global.env, y reutilizarlas en distintos stacks sin repetirlas en cada archivo. Si el prefijo desaparece o cambia, el síntoma será el mismo que vio este usuario: variables presentes en la configuración pero vacías dentro del contenedor. Hasta que Portainer lo documente o lo corrija, conviene tratar el truco como un detalle de implementación y probarlo antes de depender de él.


