La versión 3.1 de la especificación docker-compose.yml introduce soporte para secretos .
Intenté esto:
version: '3.1' services: a: image: tutum/hello-world secret: password: the_password b: image: tutum/hello-world $ docker-compose up devuelve:
Unsupported config option for services.secret: 'password'
¿Cómo podemos usar la función de secretos en la práctica?
Puede leer la sección correspondiente de la documentación oficial .
Para usar secretos, debe agregar dos cosas en su archivo docker-compose.yml . Primero, un bloque secrets: de nivel superior que define todos los secretos. Luego, otro secrets: bloque debajo de cada servicio que especifica qué secretos debe recibir el servicio.
Como ejemplo, cree los dos tipos de secretos que comprenderá Docker: secretos externos y secretos de archivo .
docker secret createLo primero: para usar secretos con Docker, el nodo en el que se encuentra debe ser parte de un enjambre.
$ docker swarm initA continuación, cree 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 pasarlo por alto).
$ echo "This is a file secret." > my_file_secret.txtdocker-compose.yml que use ambos secretos Ahora que se crearon 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 docker secret create ) o desde un archivo. Lo anterior muestra ambos ejemplos.
Implemente la pila usando:
$ docker stack deploy --compose-file=docker-compose.yml secret_test Esto creará una instancia del servicio web , llamada secret_test_web .
Use docker exec -ti [container] /bin/sh para verificar que los secretos existen.
(Nota: en el siguiente comando docker exec , la porción 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 implementamos nuestra pila.
Dado que tiene un servicio myapp y un archivo de secretos secrets.yml :
Crear un archivo de redacción:
version: '3.1' services: myapp: build: . secrets: secrets_yamlAprovisione un secreto usando este comando:
docker secret create secrets_yaml secrets.ymlImplemente su 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 proporciona sus secretos a su clúster de enjambre de ventana acoplable".
La pregunta original "¿cómo se administran los valores secretos con docker compose?" implica que el archivo docker-compose contiene valores secretos. no lo hace
Hay una pregunta diferente: "¿Dónde almacena la fuente canónica del archivo secrets.yml ". Esto depende de ti. Puede almacenarlo en su cabeza, imprimirlo en una hoja de papel, usar un administrador de contraseñas, usar una aplicación/base de datos de secretos dedicada. Diablos, incluso puedes usar un repositorio git si está protegido de forma segura. Por supuesto, nunca lo almacene dentro del sistema que está asegurando con él :)
Recomendaría la bóveda . Para almacenar un secreto:
# create a temporary secret file cat secrets.yml | vault write secret/myappsecrets -Para recuperar un secreto y ponerlo en su docker swarm:
vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -Por supuesto, puede usar el propio clúster de Docker como una única fuente de verdad para sus secretos, pero si su clúster de Docker se rompe, perderá sus 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 simular localmente o una base de datos grande que es imposible de copiar.
Nuevamente, la ventana acoplable 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:
docker secret create y los ejecuta en la terminal.Todavía tenemos que ver si aparece una aplicación de este tipo.
También puede especificar secrets almacenados localmente en un archivo usando file: clave en el objeto de secrets . Entonces no tiene que docker secret create usted mismo, Compose / docker stack deploy lo hará por usted.
version: '3.1' secrets: password: file: ./password services: password_consumer: image: alpine secrets: - passwordReferencia: Componer archivo versión 3 referencia: Secretos