network_mode network compose commands docker docker-compose docker-secrets

network - ¿Cómo manejas los valores secretos con docker-compose v3.1?



docker-compose commands (5)

¿Es esa la sangría exacta de tu archivo docker-compose.yml ? Creo que los secret secrets deben anidarse en a (es decir, uno de los servicios), no directamente en la sección de services .

La versión 3.1 de la especificación docker-compose.yml presenta soporte para secrets .

Intenté esto:

version: ''3.1'' services: a: image: tutum/hello-world secret: password: the_password b: image: tutum/hello-world

$ docker-compose up devoluciones:

Unsupported config option for services.secret: ''password''

¿Cómo podemos usar la función de secretos en la práctica?


Dado que tienes un servicio myapp y un archivo de secretos secrets.yml :

Crea un archivo de composición:

version: ''3.1'' services: myapp: build: . secrets: secrets_yaml

Proporcione un secreto usando este comando:

docker secret create secrets_yaml secrets.yml

Implementa tu servicio usando este comando:

docker deploy --compose-file docker-compose.yml myappstack

Ahora su aplicación puede acceder al archivo secreto en /run/secrets/secrets_yaml . Puede codificar esta ruta en su aplicación o crear un enlace simbólico.

La pregunta diferente

Esta respuesta es probablemente a la pregunta "¿cómo aprovisiona sus secretos a su agrupación de enjambre de acopladores"?

La pregunta original "¿cómo se gestionan los valores secretos con docker compose?" Implica que el archivo docker-compose contiene valores secretos. No es así

Hay una pregunta diferente: "¿Dónde se almacena la fuente canónica del archivo secrets.yml ". Esto depende de ti. Puede almacenarlo en su cabeza, imprimir en una hoja de papel, usar un administrador de contraseñas, usar una aplicación / base de datos secreta dedicada. Diablos, incluso puedes usar un repositorio de git si está seguro. Por supuesto, nunca lo almacene dentro del sistema que está asegurando con él :)

Recomendaría la vault . Para almacenar un secreto:

# create a temporary secret file cat secrets.yml | vault write secret/myappsecrets -

Para recuperar un secreto y ponerlo en tu enjambre de estibadores:

vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -

Por supuesto, puedes usar el cluster docker como una fuente única de verdad para tus secretos, pero si tu cluster docker se rompe, habrías perdido tus secretos. Así que asegúrese de tener una copia de seguridad en otro lugar.

La pregunta que nadie hizo

La tercera pregunta (que nadie preguntó) es cómo proporcionar secretos a las máquinas de los desarrolladores. Puede ser necesario cuando hay un servicio externo que es imposible de burlar localmente o una gran base de datos que es imposible de copiar.

De nuevo, Docker no tiene nada que ver con eso (todavía). No tiene listas de control de acceso que especifiquen qué desarrolladores tienen acceso a qué secretos. Tampoco tiene ningún mecanismo de autenticación.

La solución ideal parece ser esta:

  • Un desarrollador abre alguna aplicación web.
  • Autentica utilizando algún mecanismo de inicio de sesión único.
  • Copia una larga lista de comandos de docker secret create de docker secret create y los ejecuta en la terminal.

Todavía tenemos que ver si aparece una aplicación así.


Puede leer la sección correspondiente de la documentación oficial .

Para usar secretos necesitas agregar dos cosas en tu archivo docker-compose.yml . Primero, un secrets: alto nivel secrets: bloque que define todos los secretos. Luego, otro secrets: bloquear debajo de cada servicio que especifica qué secretos debe recibir el servicio.

Como ejemplo, cree los dos tipos de secretos que Docker comprenderá: secretos externos y secretos de archivos .

1. Crea un secreto ''externo'' usando docker secret create

Lo primero: para usar secretos con Docker, el nodo en el que se encuentra debe ser parte de un enjambre.

$ docker swarm init

Luego, crea un secreto ''externo'':

$ echo "This is an external secret" | docker secret create my_external_secret -

(Asegúrese de incluir el guión final, - . Es fácil pasar por alto).

2. Escribe otro secreto en un archivo

$ echo "This is a file secret." > my_file_secret.txt

3. Cree un archivo docker-compose.yml que use ambos secretos

Ahora que se crean ambos tipos de secretos, aquí está el archivo docker-compose.yml que leerá ambos y los escribirá en el servicio web :

version: ''3.1'' services: web: image: nginxdemos/hello secrets: # secrets block only for ''web'' service - my_external_secret - my_file_secret secrets: # top level secrets block my_external_secret: external: true my_file_secret: file: my_file_secret.txt

Docker puede leer secretos desde su propia base de datos (por ejemplo, secretos creados con la docker secret create Docker) o desde un archivo. Lo anterior muestra ambos ejemplos.

4. Despliega tu pila de prueba

Implementa la pila usando:

$ docker stack deploy --compose-file=docker-compose.yml secret_test

Esto creará una instancia del servicio web , llamada secret_test_web .

5. Verifique que el contenedor creado por el servicio tenga ambos secretos

Utilice docker exec -ti [container] /bin/sh para verificar que los secretos existen.

(Nota: en el comando de docker exec continuación, la parte de m2jgac... será diferente en su máquina. Ejecute docker ps para encontrar el nombre de su contenedor).

$ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh # Now inside secret_test_web; secrets are contained in /run/secrets/ root@secret_test_web:~$ cd /run/secrets/ root@secret_test_web:/run/secrets$ ls my_external_secret my_file_secret root@secret_test_web:/run/secrets$ cat my_external_secret This is an external secret root@secret_test_web:/run/secrets$ cat my_file_secret This is a file secret.

Si todo está bien, los dos secretos que creamos en los pasos 1 y 2 deberían estar dentro del contenedor web que se creó cuando desplegamos nuestra pila.


Supongo que la palabra clave es secrets no secret . Eso es al menos lo que entiendo al leer el schema .


También puede especificar secrets almacenados localmente en un archivo utilizando file: key in secrets object. Entonces no tienes que hacer un docker secret create tú mismo, el docker stack deploy Compose / docker stack deploy lo hará por ti.

version: ''3.1'' secrets: password: file: ./password services: password_consumer: image: alpine secrets: - password

Referencia: Redactar la referencia de la versión 3 del archivo: Secrets