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.yml
variable de entorno.Se
docker-compose.yml
generará 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
.env
archivo.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_KEY
desde el.env
archivo).Tenga en cuenta que
COMPOSE_CONFIG
se define en mi.env
archivo y se usa en mi script bash, pero puede reemplazarlo fácilmente{$COMPOSE_CONFIG}
con elmy-compose-file.yml
script 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.text
lugar decat file.text | grep foo
. En mi caso tuve que hacerloexport $(grep "^[^#]" .config | xargs) && cat docker-compose.yml | envsubst
.docker-compose up
y no condocker-compose run
..env
abajoenv_file
. Luego puede hacer referencia a las variables en eldocker-compose.yml
uso${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
.env
y estarán disponibles en docker-compose.yml.Por ejemplo, para
.env
archivo con contenido:Puede acceder a su variable dentro
docker-compose.yml
o reenviarla al contenedor:fuente
.env
, por ejemplo,config.env
no 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.yaml
archivodeclarar variable en el
.env
archivo:Cambiar
$hostname
a${HOSTNAME}
en eldocker-compose.yaml
archivoPor 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.yml
archivo. Puede usar laenv_file
configuració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.yml
el 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.sh
fuente
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-file
que le permite especificar un archivo que contiene variables.El tuyo debería verse así:
Y el comando:
fuente