Docker trong CI/CD
Build/test/push image tự động trong pipeline, tận dụng cache trong CI, build đa nền tảng (multi-platform) với Buildx.
Build image thủ công trên máy cá nhân rồi push không đáng tin cậy và không thể audit — CI/CD hoá quy trình build là điều kiện bắt buộc cho bất kỳ hệ thống production nào, nối tiếp trực tiếp CI/CD đã học ở Module 13 khoá AI Engineer, Module 13 khoá Databricks, và Module 10 khoá Fine-tuning.
🎯 Mục tiêu học tập
- Viết pipeline GitHub Actions build/test/push image Docker tự động
- Tận dụng cache layer trong môi trường CI (vốn không có state giữa các lần chạy)
- Sử dụng Docker Buildx để build image đa nền tảng (multi-platform, ví dụ amd64 + arm64)
- Thiết lập cổng chặn chất lượng: test + scan bảo mật (Module 8) trước khi cho phép push
Pipeline GitHub Actions cơ bản
# .github/workflows/docker-build.yml
name: Build and Push Docker Image
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: docker build --target test -t my-app:test .
- run: docker run --rm my-app:test pytest
- name: Log in to registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
tags: |
ghcr.io/my-org/my-app:${{ github.sha }}
ghcr.io/my-org/my-app:latest
cache-from: type=gha
cache-to: type=gha,mode=max
Cache Layer trong CI — vấn đề & giải pháp
Mỗi lần chạy CI thường là một máy (runner) hoàn toàn mới — không có build cache cục bộ từ lần build
trước như trên máy dev cá nhân (Module 2), khiến mọi lần build trong CI đều "cache miss" hoàn toàn nếu
không cấu hình gì thêm. cache-from/cache-to với backend type=gha
(GitHub Actions cache) lưu trữ layer cache giữa các lần chạy workflow — tăng tốc build CI đáng kể, đặc
biệt hữu ích khi dependency (Module 2, 6, 7) không đổi thường xuyên.
Docker Buildx — Build đa nền tảng (Multi-platform)
Máy Mac Apple Silicon (arm64) và server cloud phổ biến (amd64/x86_64) có kiến trúc CPU khác nhau — image build trên máy này không tự chạy được trên kiến trúc kia. Buildx (dùng QEMU giả lập kiến trúc khác) cho phép build 1 image chứa sẵn cả 2 kiến trúc trong cùng 1 manifest, Docker tự chọn đúng bản khi pull tuỳ theo máy đang chạy:
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t my-org/my-app:1.0.0 \
--push .
Nếu team dev dùng Mac Apple Silicon nhưng server production chạy amd64 (phổ biến với instance cloud truyền thống), luôn build multi-platform hoặc build riêng cho đúng kiến trúc production — image build trên Mac M-series không tự chạy được trên server amd64 nếu build đơn kiến trúc mặc định.
Cổng chặn chất lượng trước khi Push
Kết hợp các bước đã học thành 1 pipeline hoàn chỉnh, đúng tinh thần "test là cổng chặn deploy" đã áp dụng xuyên suốt 3 khoá học trước: build → chạy unit test bên trong container test → quét lỗ hổng bảo mật (Module 8, dùng Trivy làm bước CI, chặn nếu có CVE mức CRITICAL) → chỉ push lên registry (Module 9) khi mọi bước trên đều pass. Không bao giờ push thẳng image chưa qua kiểm tra lên registry mà pipeline production sẽ pull về.
🏋️ Bài tập thực hành
Thiết lập GitHub Actions cho 1 project đã container hoá ở Module 6/7: build → test → scan bảo mật (Trivy, chặn nếu có CVE CRITICAL) → push lên GHCR với tag kết hợp git SHA + latest, bật cache GitHub Actions để tăng tốc build. Thử tạo 1 PR có lỗi (test fail hoặc dependency có lỗ hổng đã biết) để xác nhận pipeline chặn đúng cách, không cho push.
📚 Tài nguyên học tập
-
Docker — build-push-action (GitHub Action)GitHub Action chính thức build và push imageRepo
-
Docker — GitHub Actions cacheHướng dẫn chính thức cấu hình cache trong GitHub ActionsDocs
-
Docker — Buildx documentationTài liệu chính thức Docker BuildxDocs
✅ Tự đánh giá hoàn thành
- Viết được pipeline GitHub Actions build/test/push image tự động
- Cấu hình cache layer hoạt động đúng trong môi trường CI
- Build được image multi-platform bằng Buildx khi cần
- Pipeline có cổng chặn test + security scan trước khi cho phép push