Đăng vào

GitHub Actions build và push Docker image lên ghcr.io

Giới thiệu

GitHub Actions là một công cụ mạnh mẽ giúp tự động hóa quy trình phát triển phần mềm, bao gồm cả việc build và deploy Docker image. Với GitHub Container Registry (GHCR), bạn có thể lưu trữ và quản lý các Docker image một cách dễ dàng ngay trong hệ sinh thái GitHub.

Trong bài viết này, mình sẽ hướng dẫn bạn cách thiết lập một workflow GitHub Actions để tự động build Docker image và đẩy lên GHCR, giúp tối ưu hóa quy trình CI/CD của dự án. Cùng bắt đầu nhé! 🚀

Triển khai

docker.yaml
name: "Build and Push Docker Image"
on:
  push:
    branches:
      - main

jobs:
  build-docker:
    permissions:
      contents: read
      packages: write

    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/${{ github.repository_owner }}/my-image
          tags: |
            type=raw,value=latest,enable={{is_default_branch}}
            type=ref,event=branch

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Log in to the Container registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build push docker image
        uses: docker/build-push-action@v6
        with:
          context: .
          file: Dockerfile
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

Workflow này tự động build và đẩy (push) Docker image lên GitHub Container Registry (ghcr.io) mỗi khi có code được đẩy lên nhánh main.

Các bước hoạt động

  1. Kích hoạt (Trigger)

    • Workflow được kích hoạt khi có sự kiện push lên nhánh main.
  2. Phân quyền (Permissions)

    • Cho phép đọc nội dung repository (contents: read) và ghi package (packages: write) để có thể push image lên ghcr.io.
  3. Chạy trên môi trường

    • Workflow chạy trên máy ảo ubuntu-latest.
  4. Các bước thực hiện (Steps)

    • Checkout: Sử dụng action actions/checkout@v4 để lấy mã nguồn về máy runner.
    • Docker meta: Sử dụng action docker/metadata-action@v5 để tạo metadata cho image, bao gồm tên image và các tag (ví dụ: latest, tên nhánh).
    • Set up QEMU: Thiết lập QEMU để hỗ trợ build đa nền tảng (multi-platform).
    • Set up Docker Buildx: Thiết lập Docker Buildx để build image hiệu quả hơn và hỗ trợ cache.
    • Log in to the Container registry: Đăng nhập vào GitHub Container Registry (ghcr.io) bằng tài khoản GitHub và token bí mật.
    • Build push docker image: Sử dụng action docker/build-push-action@v6 để build Docker image từ file Dockerfile và push lên ghcr.io với các tag và label đã tạo ở bước meta. Đồng thời sử dụng cache để tăng tốc độ build.

Kết quả

  • Mỗi lần push lên nhánh main, một Docker image mới sẽ được build và đẩy lên registry ghcr.io với các tag phù hợp (ví dụ: latest, tên nhánh).

Demo

Chúc thành công,

ANH NGUYỄN

Hiện tại mình đang tìm kiếm công việc mới với nhiều thử thách để chinh phục.

Mọi thông tin có thể gửi về me@nvtienanh.info.