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í:
set -a
source .my-env
docker-compose up -d
Luego puede hacer referencia a las variables en docker-compose.yml usando $ {VARIABLE}, así:
db:
image: "postgres:${POSTGRES_VERSION}"
Y aquí hay más información de los documentos, tomada aquí: https://docs.docker.com/compose/compose-file/#variable-substitution
Cuando ejecuta docker-compose con esta configuración, Compose busca la variable de entorno POSTGRES_VERSION en el shell y sustituye su valor en. Para este ejemplo, Compose resuelve la imagen en postgres: 9.3 antes de ejecutar la configuración.
Si no se establece una variable de entorno, Componer sustituye con una cadena vacía. En el ejemplo anterior, si POSTGRES_VERSION no está configurado, el valor de la opción de imagen es postgres :.
Se admiten las sintaxis $ VARIABLE y $ {VARIABLE}. Las características extendidas de estilo de shell, como $ {VARIABLE-default} y $ {VARIABLE / foo / bar}, no son compatibles.
Si necesita poner un signo de dólar literal en un valor de configuración, use un signo de dólar doble ($$).
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:
EXAMPLE_URL=http://example.com
# Note that the variable below is commented out and will not be used:
# EXAMPLE_URL=http://example2.com
SECRET_KEY=ABDFWEDFSADFWWEFSFSDFM
# You can even define the compose file in an env variable like so:
COMPOSE_CONFIG=my-compose-file.yml
# You can define other compose files, and just comment them out
# when not needed:
# COMPOSE_CONFIG=another-compose-file.yml
luego ejecute este script bash en el mismo directorio, que debería implementar todo correctamente:
#!/bin/bash
docker rm -f `docker ps -aq -f name=myproject_*`
set -a
source .env
cat ${COMPOSE_CONFIG} | envsubst | docker-compose -f - -p "myproject" up -d
Simplemente haga referencia a sus variables env en su archivo de composición con la sintaxis bash habitual (es decir, ${SECRET_KEY}
para insertarla SECRET_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 el my-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.