Skip to content

Commit fac105e

Browse files
committed
Update README.md to enhance the agenda section with additional topics on bind mounts, volumes, and tmpfs mounts, and improve content clarity throughout the document.
1 parent 5035289 commit fac105e

2 files changed

Lines changed: 378 additions & 51 deletions

File tree

01-contenedores/contenedores-iii/README.md

Lines changed: 315 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
- [▶️ Ejecutar un nuevo contenedor](#️-ejecutar-un-nuevo-contenedor-usando-tu-nueva-imagen)
1717
- [🏗️ Imágenes multi-stage](#️-imágenes-multi-stage)
1818
- [🎯 Docker Bake](#-docker-bake)
19-
- [📦 Publicar nuestras imágenes en Docker Hub](#-publicar-nuestras-imágenes-en-docker-hub)
19+
- [� Docker Build Checks](#-docker-build-checks)
20+
- [�📦 Publicar nuestras imágenes en Docker Hub](#-publicar-nuestras-imágenes-en-docker-hub)
2021
- [📚 Resumen de lo aprendido](#-resumen-de-lo-aprendido)
2122

2223
---
@@ -293,16 +294,305 @@ docker buildx bake
293294
docker buildx bake doom-web-multi
294295
```
295296

296-
### 💡 Ventajas de usar Bake
297+
---
298+
299+
## 🔍 Docker Build Checks
300+
301+
**Docker Build Checks** es una característica beta introducida en Dockerfile 1.8 que te permite validar tu configuración de build y realizar una serie de verificaciones antes de ejecutar tu build. Es como un **linter avanzado** para tu Dockerfile y opciones de build, o un modo de **dry-run** para builds. 🎯
302+
303+
### 🌟 ¿Por qué usar Build Checks?
304+
305+
- **✅ Validación temprana**: Detecta problemas antes de ejecutar el build
306+
- **📋 Mejores prácticas**: Asegura que tu Dockerfile sigue las recomendaciones actuales
307+
- **🚫 Anti-patrones**: Identifica patrones problemáticos en tu configuración
308+
- **🔒 Seguridad**: Ayuda a detectar configuraciones inseguras
309+
- **⚡ Eficiencia**: Ahorra tiempo evitando builds fallidos
310+
311+
### 🛠️ Requisitos
312+
313+
- **Buildx**: versión 0.15.0 o posterior
314+
- **docker/build-push-action**: versión 6.6.0 o posterior
315+
- **docker/bake-action**: versión 5.6.0 o posterior
316+
317+
### 🚀 Uso básico
318+
319+
Por defecto, los checks se ejecutan automáticamente cuando haces un build:
320+
321+
```bash
322+
docker build .
323+
```
324+
325+
**Salida de ejemplo:**
326+
```
327+
[+] Building 3.5s (11/11) FINISHED
328+
...
329+
330+
1 warning found (use --debug to expand):
331+
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 7)
332+
```
333+
334+
### 🔍 Verificar sin construir
335+
336+
Para ejecutar solo los checks sin construir la imagen:
337+
338+
```bash
339+
docker build --check .
340+
```
341+
342+
**Ejemplo de salida detallada:**
343+
```
344+
[+] Building 1.5s (5/5) FINISHED
345+
=> [internal] connecting to local controller
346+
=> [internal] load build definition from Dockerfile
347+
=> => transferring dockerfile: 253B
348+
349+
JSONArgsRecommended - https://docs.docker.com/go/dockerfile/rule/json-args-recommended/
350+
JSON arguments recommended for ENTRYPOINT/CMD to prevent unintended behavior related to OS signals
351+
Dockerfile:7
352+
--------------------
353+
5 |
354+
6 | COPY index.js .
355+
7 | >>> CMD node index.js
356+
8 |
357+
--------------------
358+
```
359+
360+
### 📝 Ejemplo práctico con nuestro proyecto doom-web
361+
362+
Vamos a probar los checks con nuestro Dockerfile actual:
363+
364+
```bash
365+
cd doom-web
366+
docker build --check .
367+
```
368+
369+
Si hay warnings, puedes ver más detalles con:
370+
371+
```bash
372+
docker --debug build --check .
373+
```
374+
375+
### ⚙️ Configuración avanzada
376+
377+
#### 🚨 Fallar el build en violaciones
378+
379+
Puedes configurar que el build falle cuando se encuentren violaciones usando la directiva `check=error=true`:
380+
381+
```dockerfile
382+
# syntax=docker/dockerfile:1
383+
# check=error=true
384+
385+
FROM node:20-alpine
386+
COPY package*.json ./
387+
RUN npm install
388+
COPY . .
389+
CMD npm start # Esto generará un warning que ahora será un error
390+
```
391+
392+
También puedes configurarlo vía CLI:
393+
394+
```bash
395+
docker build --build-arg "BUILDKIT_DOCKERFILE_CHECK=error=true" .
396+
```
397+
398+
#### 🙈 Omitir checks específicos
399+
400+
Para saltar checks específicos:
401+
402+
```dockerfile
403+
# syntax=docker/dockerfile:1
404+
# check=skip=JSONArgsRecommended,StageNameCasing
405+
406+
FROM alpine AS BASE_STAGE
407+
CMD echo "Hello, world!"
408+
```
409+
410+
O vía CLI:
411+
412+
```bash
413+
docker build --build-arg "BUILDKIT_DOCKERFILE_CHECK=skip=JSONArgsRecommended" .
414+
```
415+
416+
Para saltar todos los checks:
417+
418+
```dockerfile
419+
# syntax=docker/dockerfile:1
420+
# check=skip=all
421+
```
422+
423+
#### 🧪 Checks experimentales
424+
425+
Para habilitar checks experimentales:
426+
427+
```bash
428+
docker build --build-arg "BUILDKIT_DOCKERFILE_CHECK=experimental=all" .
429+
```
297430

298-
1. **🎯 Consistencia**: Todos en el equipo usan la misma configuración
299-
2. **⚡ Eficiencia**: Builds paralelos y reutilización de capas
300-
3. **📖 Legibilidad**: Configuración clara y documentada
301-
4. **🔧 Flexibilidad**: Variables y herencia entre targets
302-
5. **🌐 Multi-plataforma**: Builds para diferentes arquitecturas fácilmente
431+
O en el Dockerfile:
432+
433+
```dockerfile
434+
# syntax=docker/dockerfile:1
435+
# check=experimental=all
436+
```
437+
438+
#### 🔧 Combinando parámetros
439+
440+
Puedes combinar múltiples configuraciones separándolas con punto y coma:
441+
442+
```dockerfile
443+
# syntax=docker/dockerfile:1
444+
# check=skip=JSONArgsRecommended;error=true;experimental=all
445+
```
446+
447+
### 🎮 Aplicando checks a nuestro proyecto doom-web
448+
449+
Crear un `Dockerfile.checked` que siga las mejores prácticas:
450+
451+
```dockerfile
452+
# syntax=docker/dockerfile:1
453+
# check=error=true
454+
455+
FROM node:20-alpine AS base
456+
457+
LABEL maintainer="Gisela Torres <gisela.torres@returngis.net>"
458+
459+
WORKDIR /usr/src/app
460+
461+
# Mejores prácticas para el manejo de dependencias
462+
COPY package*.json ./
463+
RUN npm ci --only=production && npm cache clean --force
464+
465+
# Copiar archivos de la aplicación
466+
COPY . .
467+
468+
# Exponer puerto
469+
EXPOSE 3000
470+
471+
# Usar user no-root por seguridad
472+
RUN chown -R node:node /usr/src/app
473+
USER node
474+
475+
# Usar formato JSON para CMD (evita warnings)
476+
CMD ["npm", "start"]
477+
```
478+
479+
Probar los checks:
480+
481+
```bash
482+
docker build --check -f Dockerfile.checked .
483+
```
484+
485+
### 🎯 Integración con Docker Bake
486+
487+
También puedes usar checks con Docker Bake añadiendo la configuración en tu `docker-bake.hcl`:
488+
489+
```hcl
490+
target "doom-web-checked" {
491+
context = "."
492+
dockerfile = "Dockerfile.checked"
493+
tags = ["doom-web:checked"]
494+
args = {
495+
BUILDKIT_DOCKERFILE_CHECK = "error=true"
496+
}
497+
}
498+
499+
target "doom-web-dry-run" {
500+
context = "."
501+
dockerfile = "Dockerfile"
502+
args = {
503+
BUILDKIT_DOCKERFILE_CHECK = "error=true;experimental=all"
504+
}
505+
call = "check" # Solo ejecutar checks, no build
506+
}
507+
```
508+
509+
Ejecutar:
510+
511+
```bash
512+
# Solo checks
513+
docker buildx bake doom-web-dry-run --check
514+
515+
# Build con checks estrictos
516+
docker buildx bake doom-web-checked
517+
```
518+
519+
### 🔧 Checks más comunes
520+
521+
| Check | Descripción | Ejemplo problemático |
522+
|-------|-------------|---------------------|
523+
| **JSONArgsRecommended** | CMD/ENTRYPOINT deberían usar formato JSON | `CMD npm start`|
524+
| **StageNameCasing** | Nombres de stage deberían estar en minúsculas | `FROM alpine AS BASE_STAGE`|
525+
| **FromAsCasing** | La palabra AS debería estar en mayúsculas | `FROM alpine as base`|
526+
| **NoEmptyCommand** | Comandos no deberían estar vacíos | `RUN`|
527+
| **UndefinedVariable** | Variables no definidas en ARG | `RUN echo $UNDEFINED_VAR`|
528+
529+
### 📊 Integración con CI/CD
530+
531+
#### GitHub Actions
532+
533+
```yaml
534+
name: Docker Build with Checks
535+
on: [push, pull_request]
536+
537+
jobs:
538+
build:
539+
runs-on: ubuntu-latest
540+
steps:
541+
- uses: actions/checkout@v4
542+
543+
- name: Set up Docker Buildx
544+
uses: docker/setup-buildx-action@v3
545+
546+
- name: Build with checks
547+
uses: docker/build-push-action@v6.6.0
548+
with:
549+
context: .
550+
push: false
551+
build-args: |
552+
BUILDKIT_DOCKERFILE_CHECK=error=true
553+
```
554+
555+
Los checks aparecerán como anotaciones en las pull requests de GitHub! 📝
556+
557+
### 💡 Mejores prácticas
558+
559+
1. **🎯 Usa checks desde el inicio**: Integra checks en tu workflow de desarrollo
560+
2. **⚠️ Trata warnings como errores**: Usa `check=error=true` en producción
561+
3. **📋 Documenta excepciones**: Si skips checks, documenta por qué
562+
4. **🔄 Actualiza regularmente**: Los checks evolucionan con las mejores prácticas
563+
5. **👥 Estandariza en equipo**: Usa la misma configuración en todo el proyecto
564+
565+
### 🎯 Ejercicio práctico
566+
567+
1. Ejecuta checks en nuestro Dockerfile actual:
568+
```bash
569+
cd doom-web
570+
docker build --check .
571+
```
572+
573+
2. Corrige los warnings encontrados creando un `Dockerfile.best-practices`
574+
575+
3. Añade la configuración a tu `docker-bake.hcl`:
576+
```hcl
577+
target "doom-web-validated" {
578+
context = "."
579+
dockerfile = "Dockerfile.best-practices"
580+
tags = ["doom-web:validated"]
581+
args = {
582+
BUILDKIT_DOCKERFILE_CHECK = "error=true"
583+
}
584+
}
585+
```
586+
587+
4. Prueba el build con checks estrictos:
588+
```bash
589+
docker buildx bake doom-web-validated
590+
```
303591

304592
> [!TIP]
305-
> 💡 **Consejo**: Instala la [extensión de Docker para VS Code](https://marketplace.visualstudio.com/items?itemName=docker.docker) para obtener linting y navegación de código en archivos Bake.
593+
> 💡 **Consejo**: Instala la [extensión de Docker para VS Code](https://marketplace.visualstudio.com/items?itemName=docker.docker) para obtener linting en tiempo real de tu Dockerfile.
594+
595+
---
306596

307597
## 📦 Publicar nuestras imágenes en Docker Hub
308598

@@ -399,17 +689,29 @@ En este módulo hemos cubierto los aspectos fundamentales de la contenerización
399689
- Builds concurrentes y paralelos
400690
- Mejor organización para proyectos complejos
401691

402-
5. **📦 Publicación en Docker Hub**: Distribución de imágenes
692+
5. **� Docker Build Checks**: Validación y linting avanzado
693+
- Detección temprana de problemas en Dockerfiles
694+
- Verificación de mejores prácticas de seguridad
695+
- Integración con CI/CD para calidad de código
696+
697+
6. **�📦 Publicación en Docker Hub**: Distribución de imágenes
403698
- Nomenclatura correcta de imágenes
404699
- Autenticación y push de imágenes
405700
- Gestión de tags y versiones
406701

702+
6. **🔍 Docker Build Checks**: Validación de configuración de builds
703+
- Detección temprana de problemas
704+
- Asegura el cumplimiento de mejores prácticas
705+
- Identificación de configuraciones inseguras
706+
407707
### 🛠️ Herramientas exploradas:
408708

409709
- **Docker CLI**: Comandos básicos de construcción
410710
- **VS Code Extension**: Generación automática de Dockerfiles
411711
- **IA Tools**: Microsoft Edge Copilot y GitHub Copilot
412712
- **Docker Buildx**: Funcionalidades avanzadas con Bake
713+
- **Docker Build Checks**: Validación y linting de Dockerfiles
714+
- **Docker Build Checks**: Validación y verificación de Dockerfiles
413715

414716
### ✨ Beneficios obtenidos:
415717

@@ -423,9 +725,10 @@ En este módulo hemos cubierto los aspectos fundamentales de la contenerización
423725

424726
1. Experimentar con diferentes estrategias de multi-stage
425727
2. Implementar Docker Bake en proyectos reales
426-
3. Explorar Docker Compose para aplicaciones multi-contenedor
427-
4. Aprender sobre orquestación con Kubernetes
428-
5. Profundizar en seguridad de contenedores
728+
3. Integrar Docker Build Checks en el workflow de desarrollo
729+
4. Explorar Docker Compose para aplicaciones multi-contenedor
730+
5. Aprender sobre orquestación con Kubernetes
731+
6. Profundizar en seguridad de contenedores
429732

430733
> [!SUCCESS]
431734
> 🎉 **¡Felicitaciones!** Ya dominas los fundamentos de la contenerización. Estás listo para el siguiente nivel: orquestación de contenedores.

0 commit comments

Comments
 (0)