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
dedocker 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