La gestión de secretos en Docker no es opcional
La gestión de secretos en Docker empieza por asumir que cualquier valor que pase por un ARG, un ENV o un COPY del Dockerfile queda escrito para siempre en las capas de la imagen y en su metadata, visible con docker history o docker inspect por cualquiera que descargue esa imagen. En este lab lo demostramos primero fabricando la fuga y luego la corregimos con cuatro técnicas que sí mantienen el secreto fuera de la imagen: un build secret de BuildKit, un archivo montado en solo lectura, un env-file bien acotado y los secrets nativos de Docker Compose sin necesidad de Swarm.
Qué técnica usar según el momento
Si el secreto solo hace falta durante la construcción de la imagen (una clave privada para clonar un repositorio, un token para descargar una dependencia), docker build --secret lo monta en /run/secrets/ únicamente durante esa instrucción RUN y nunca llega a una capa. Si el secreto lo necesita el proceso en tiempo de ejecución, un archivo montado como :ro o el bloque secrets: de Compose evitan que aparezca en el Env del contenedor, algo que sí ocurre con --env-file. Para equipos que gestionan credenciales a mayor escala merece la pena dar el salto a un gestor dedicado como Vault de HashiCorp, y en clústeres reales con Docker Swarm existe además docker secret create, cifrado en el Raft log del clúster.
Para seguir
Repasa también nuestra guía de variables de entorno y secretos en Docker Compose y, si aún no tienes Docker instalado, la guía para instalar Docker en Debian. Más plantillas reproducibles en la categoría Herramientas y en el resto de laboratorios prácticos. La referencia oficial de RUN --mount=type=secret está en la Dockerfile reference de Docker, el detalle de los secrets de Compose en la Compose Specification, y un repaso más amplio de buenas prácticas en la Docker Security Cheat Sheet de OWASP.
Preguntas frecuentes
¿Por qué no debo poner un secreto en ARG o ENV del Dockerfile?
Porque ambos quedan grabados en las capas y en la metadata de la imagen para siempre: cualquiera que ejecute docker history o docker inspect sobre esa imagen puede leerlo, incluso si lo «borras» en una instrucción posterior, la capa anterior sigue ahí.
¿Qué es un build secret de BuildKit y en qué se diferencia de ARG?
docker build –secret monta un archivo en /run/secrets/ solo durante la instrucción RUN que lo pide y nunca lo escribe en una capa ni en el historial. ARG, en cambio, queda registrado como parte de la metadata de compilación de la imagen.
¿Es seguro usar –env-file con docker run?
Es mejor que ARG/ENV en el Dockerfile porque el secreto nunca toca la imagen, pero sigue siendo visible con docker inspect sobre el contenedor en marcha. Para procesos en ejecución, un archivo montado en solo lectura o los secrets de Compose son más seguros.
¿Necesito Docker Swarm para usar los secrets de Compose?
No. El bloque secrets: de nivel superior con un driver file: funciona con un docker compose up normal en un único host. docker secret create y el cifrado en el Raft log sí requieren un clúster iniciado con docker swarm init.