¿Cómo utilizar un valor secreto de Docker/swarm como variable de entorno en "creación de servicio Docker"?

¿Cómo utilizar un valor secreto de Docker/swarm como variable de entorno en "creación de servicio Docker"?

Necesito escribir scripts que creen servicios en clústeres de Docker Swarm. Un script de ejemplo sería similar a este:

docker service create \
    --name postgres \
    --mode global \
    --constraint "node.labels.postgres==master" \
    --network my-network \
    --env POSTGRES_USER="postgres" \
    --env POSTGRES_PASSWORD="****" \
    postgres:10

Las variables de entorno POSTGRES_USER y POSTGRES_PASSWORD deben provenir de los secretos de Docker. Por ejemplo:

echo "example_password" | docker secret create postgres-password -

Entiendo que se puede acceder al secreto como un archivo desde dentro de un contenedor en ejecución. Pero en el ejemplo anterior, se debe pasar al comando "crear servicio" como una variable de entorno. Se utiliza como punto de entrada del contenedor, por lo que debe presentarse ANTES de que se cree el contenedor. Entonces, ¿cómo puedo pasar un secreto al modificador --env del comando "docker service create"?

Respuesta1

Como se indica aquíhttps://github.com/docker-library/docs/blob/master/postgres/README.mdpuede usar secretos de enjambre en el servicio postgres si agrega el sufijo _FILE como:

docker service create \
    --name postgres \
    --mode global \
    --constraint "node.labels.postgres==master" \
    --network my-network \
    --secret "postgres-password" \
    --env POSTGRES_USER="postgres" \
    --env POSTGRES_PASSWORD_FILE="/run/secrets/postgres-password" \
    postgres:10 

Si pregunta acerca de una solución genérica para cualquier servicio, no es posible sin crear un contenedor o servicio que exponga las contraseñas en texto sin cifrar (por ejemplo, Nginx, que lee contraseñas de archivos que son secretos).

información relacionada