Construir una imagen con control de caché y manejo de secretos
En este paso, aprenderás sobre el control de la caché de construcción de Docker y cómo manejar secretos durante el proceso de build usando el tipo de montaje secret
de BuildKit. La caché de build puede acelerar significativamente las construcciones, pero a veces necesitas desactivarla. Manejar secretos de forma segura es crucial para evitar incrustar información sensible en las capas de tu imagen.
Primero, asegúrate de estar en el directorio ~/project
:
cd ~/project
Modifiquemos el Dockerfile
para incluir un paso donde podamos controlar el caché y demostrar el manejo de secretos. Añadiremos un paso simple de creación de archivo y un paso hipotético que usaría un secreto.
Abre el Dockerfile
para editar:
nano Dockerfile
Modifica el contenido para incluir un comando RUN
que crea un archivo con marca de tiempo y un marcador de posición para usar un secreto:
FROM ubuntu:latest
ARG MESSAGE="Hello, Docker!"
RUN apt-get update && apt-get install -y cowsay
LABEL maintainer="Your Name <[email protected]>"
RUN echo "Build time: $(date)" > /app/build_info.txt
## Este es un marcador de posición para un comando que usaría un secreto
## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
CMD ["cowsay", "$MESSAGE"]
Añadimos RUN echo "Build time: $(date)" > /app/build_info.txt
. Este comando crea un archivo /app/build_info.txt
que contiene la marca de tiempo cuando se construyó esta capa. Por defecto, Docker almacena en caché las capas. Si construyes la imagen múltiples veces sin cambiar las instrucciones anteriores a este comando RUN
, esta capa podría servirse desde la caché y la marca de tiempo no se actualizaría.
Guarda el Dockerfile
modificado presionando Ctrl + X
, luego Y
, y Enter
.
Ahora, construyamos la imagen con un nuevo tag, my-cached-image
.
docker build -t my-cached-image .
Observa la salida. Si has construido la imagen recientemente, podrías ver ---> Using cache
para algunos pasos.
Para demostrar el control de caché, construyamos la imagen nuevamente, pero esta vez desactivaremos la caché para todo el build usando la bandera --no-cache
.
docker build --no-cache -t my-no-cache-image .
Verás que Docker reconstruye cada capa, incluso si las instrucciones no han cambiado. Esto es útil cuando quieres asegurarte de que todas las dependencias se obtienen frescas o cuando un build anterior falló de manera que corrompió la caché.
Ahora, hablemos del manejo de secretos. La línea comentada ## RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret > /app/secret_info.txt
demuestra cómo usarías un secreto con BuildKit. Para usar esto, necesitarías activar BuildKit (que normalmente está activado por defecto en versiones recientes de Docker) y proporcionar el secreto durante el build usando la bandera --secret
.
Por ejemplo, si tuvieras un archivo llamado mysecret.txt
conteniendo tu secreto, construirías así (este comando no funcionará tal cual porque no tenemos un archivo mysecret.txt
y la línea está comentada, pero muestra la sintaxis):
## docker build --secret id=mysecret,src=mysecret.txt -t my-secret-image .
La instrucción RUN --mount=type=secret,id=mysecret
hace que el contenido del secreto esté disponible en /run/secrets/mysecret
solo durante el paso de build. El secreto no se incluye en las capas finales de la imagen. Esta es la forma segura de manejar información sensible como claves API o contraseñas durante builds.
Como no tenemos un archivo secreto y la línea está comentada, no ejecutaremos el comando de build relacionado con secretos. Sin embargo, entender los conceptos de --no-cache
y el tipo de montaje secret
es importante para controlar tus builds y manejar datos sensibles.