Me gustaría poder usar variables env dentro de docker-compose.yml, con valores pasados en el momento de docker-compose. Este es el ejemplo. Estoy haciendo esto hoy con el comando básico Docker Run, que está envuelto en mi propio script. ¿Hay alguna manera de lograrlo con componer, sin esos envoltorios de bash?
proxy:
hostname: $hostname
volumes:
- /mnt/data/logs/$hostname:/logs
- /mnt/data/$hostname:/data
docker
docker-compose
Dmitry z
fuente
fuente

Respuestas:
template.yml, que es sudocker-compose.ymlvariable de entorno.Se
docker-compose.ymlgenerará un nuevo archivo con los valores correctos de las variables de entorno.Ejemplo de archivo template.yml:
Archivo env.sh de muestra:
fuente
La solución DOCKER:
Parece que docker-compose 1.5+ ha habilitado la sustitución de variables: https://github.com/docker/compose/releases
El último Docker Compose le permite acceder a variables de entorno desde su archivo de redacción. Para que pueda obtener sus variables de entorno, luego ejecute Compose así:
Luego puede hacer referencia a las variables en docker-compose.yml usando $ {VARIABLE}, así:
Y aquí hay más información de los documentos, tomada aquí: https://docs.docker.com/compose/compose-file/#variable-substitution
Y creo que esta característica se agregó en esta solicitud de extracción: https://github.com/docker/compose/pull/1765
La solución BASH:
Noté que la gente tiene problemas con el soporte de variables de entorno de Docker. En lugar de tratar con variables de entorno en Docker, volvamos a lo básico, como bash! Aquí hay un método más flexible que utiliza un script bash y un
.envarchivo.Un ejemplo de archivo .env:
luego ejecute este script bash en el mismo directorio, que debería implementar todo correctamente:
Simplemente haga referencia a sus variables env en su archivo de composición con la sintaxis bash habitual (es decir,
${SECRET_KEY}para insertarlaSECRET_KEYdesde el.envarchivo).Tenga en cuenta que
COMPOSE_CONFIGse define en mi.envarchivo y se usa en mi script bash, pero puede reemplazarlo fácilmente{$COMPOSE_CONFIG}con elmy-compose-file.ymlscript bash.También tenga en cuenta que etiqueté esta implementación al nombrar todos mis contenedores con el prefijo "myproject". Puede usar cualquier nombre que desee, pero ayuda a identificar sus contenedores para que pueda consultarlos fácilmente más adelante. Suponiendo que sus contenedores no tienen estado, como deberían ser, este script eliminará y volverá a implementar sus contenedores rápidamente de acuerdo con sus parámetros de archivo .env y su archivo YAML de composición.
Actualización Dado que esta respuesta parece bastante popular, escribí una publicación de blog que describe mi flujo de trabajo de implementación de Docker con más profundidad: http://lukeswart.net/2016/03/lets-deploy-part-1/ Esto podría ser útil cuando agregue más complejidad para una configuración de implementación, como configuraciones nginx, certificados LetsEncrypt y contenedores vinculados.
fuente
grep foo file.textlugar decat file.text | grep foo. En mi caso tuve que hacerloexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst.docker-compose upy no condocker-compose run..envabajoenv_file. Luego puede hacer referencia a las variables en eldocker-compose.ymluso${VARIABLE}Parece que docker-compose tiene soporte nativo ahora para las variables de entorno predeterminadas en el archivo .
todo lo que necesita hacer es declarar sus variables en un archivo llamado
.envy estarán disponibles en docker-compose.yml.Por ejemplo, para
.envarchivo con contenido:Puede acceder a su variable dentro
docker-compose.ymlo reenviarla al contenedor:fuente
.env, por ejemplo,config.envno me funcionó.Lo siguiente es aplicable para docker-compose 3.x Establecer variables de entorno dentro del contenedor
Cree un archivo .env en la misma ubicación que docker-compose.yml
y tu archivo de redacción será como
fuente
fuente
Cuando use variables de entorno para volúmenes que necesita:
crear un archivo .env en la misma carpeta que contiene el
docker-compose.yamlarchivodeclarar variable en el
.envarchivo:Cambiar
$hostnamea${HOSTNAME}en eldocker-compose.yamlarchivoPor supuesto, puede hacerlo dinámicamente en cada compilación como:
fuente
The .env file feature only works when you use the docker-compose up command and does not work with docker stack deploy.La mejor manera es especificar variables de entorno fuera del
docker-compose.ymlarchivo. Puede usar laenv_fileconfiguración y definir su archivo de entorno dentro de la misma línea. Luego, hacer un docker-componer nuevamente debería recrear los contenedores con las nuevas variables de entorno.Así es como se ve mi docker-compose.yml:
fuente
No puedes ... todavía. Pero esta es una alternativa, piense como un generador docker-composer.yml:
https://gist.github.com/Vad1mo/9ab63f28239515d4dafd
Básicamente un script de shell que reemplazará sus variables. También puede usar la tarea Grunt para construir su archivo de composición de Docker al final de su proceso de CI.
fuente
Tengo un script bash simple que creé para esto, solo significa ejecutarlo en su archivo antes de usarlo: https://github.com/antonosmond/subber
Básicamente, simplemente cree su archivo de composición utilizando llaves dobles para denotar variables de entorno, por ejemplo:
Cualquier cosa entre llaves dobles se reemplazará con la variable de entorno del mismo nombre, así que si tuviera las siguientes variables de entorno establecidas:
al ejecutar
subber docker-compose.ymlel archivo resultante se vería así:fuente
Hasta donde yo sé, este es un trabajo en progreso. Quieren hacerlo, pero aún no se ha lanzado. Ver 1377 (el "nuevo" 495 que fue mencionado por @Andy).
Terminé implementando el enfoque "generar .yml como parte de CI" propuesto por @Thomas.
fuente
agregar env al archivo .env
Como
luego guárdelo en
deploy.shfuente
Utilice el archivo .env para definir valores dinámicos en docker-compse.yml. Ya sea puerto o cualquier otro valor.
Muestra docker-compose:
Dentro del archivo .env puede definir el valor de estas variables:
fuente
Use la versión 3.6:
Lo obtuve de este enlace https://github.com/docker/cli/issues/939
fuente
Desde 1.25.4, docker-compose admite la opción
--env-fileque le permite especificar un archivo que contiene variables.El tuyo debería verse así:
Y el comando:
fuente