f7ebfffddb
docker-node image / build (arm64) (push) Successful in 32s
docker-node image / build (amd64) (push) Successful in 55s
node-python image / build (arm64) (push) Successful in 1m2s
docker-node image / amend-manifest (push) Successful in 12s
node-python image / build (amd64) (push) Successful in 1m45s
node-python image / amend-manifest (push) Successful in 9s
4.0 KiB
4.0 KiB
Node + Go Base Image Design
Context
Repository này đang duy trì các Docker base image nhỏ, tập trung cho từng nhu cầu riêng:
docker-node.Dockerfile: Node.js + Docker CLI + gitnode-python.Dockerfile: Node.js + Python + git
Mục tiêu của thay đổi này là bổ sung thêm một base image mới cho nhu cầu chạy dự án có cả Node.js và Go, đồng thời giữ cấu trúc và phong cách nhất quán với các image hiện có.
Goals
- Thêm một Dockerfile mới cho image
node-go - Giữ base image đồng nhất với repo:
node:lts-slim - Cài Go từ tarball chính thức thay vì
apt - Giữ
GO_VERSIONở mức dễ đọc theo nhánh chính như1.26 - Giữ image tối giản, chỉ cài thêm các gói hệ thống thật sự cần thiết
- Cập nhật
README.mdđể công bố image mới và các thành phần đi kèm
Non-Goals
- Không thêm Docker CLI
- Không thêm Python
- Không pin cứng Node sang một major riêng ngoài
node:lts-slim - Không thêm bộ công cụ build phụ ngoài những gì cần để tải và giải nén Go
Options Considered
Option 1: Cài Go từ Debian apt
Ưu điểm:
- Dockerfile ngắn hơn
- Ít logic cài đặt hơn
Nhược điểm:
- Version Go thường chậm hơn bản phát hành chính thức
- Khó dùng làm base image chung cho CI hoặc project cần Go mới hơn
Option 2: Cài Go từ tarball chính thức
Ưu điểm:
- Kiểm soát nhánh version Go rõ ràng bằng biến môi trường
- Cập nhật nhanh hơn so với
apt - Phù hợp hơn cho image nền dùng lại nhiều nơi
Nhược điểm:
- Dockerfile dài hơn một chút
- Cần xử lý mapping kiến trúc để chọn đúng tarball
Chosen Design
Chọn Option 2.
Image mới sẽ:
- dùng
FROM node:lts-slim - cài
ca-certificates,curl,git - khai báo
GO_VERSION - xác định kiến trúc hiện tại từ
dpkg --print-architecture - nếu
GO_VERSIONlàmajor.minor, tải bản.0tương ứng trong nhánh đó - tải Go tarball phù hợp từ
https://go.dev/dl/ - giải nén vào
/usr/local/go - thêm
/usr/local/go/binvàoPATH - giữ
WORKDIR /app
Implementation Details
Dockerfile mới
Tạo file node-go.Dockerfile với cấu trúc gần giống các Dockerfile hiện có trong repo:
FROM node:lts-slim- Khai báo
ENV DEBIAN_FRONTEND=noninteractive - Cài các package hệ thống tối thiểu:
ca-certificatescurlgit
- Khai báo
ARG GO_VERSION - Dùng
dpkg --print-architectuređể map:amd64->linux-amd64arm64->linux-arm64
- Nếu
GO_VERSIONlàmajor.minor, map sang.0để tạo version tải cụ thể - Tải tarball Go tương ứng, giải nén vào
/usr/local - Xóa file tạm và cache
apt - Khai báo
PATH=/usr/local/go/bin:${PATH} - Giữ
WORKDIR /app
README
README.md sẽ được cập nhật để thêm mục node-go, gồm:
- image tag dự kiến theo naming convention hiện có
- đường dẫn Dockerfile
- danh sách phần mềm chính:
- Node.js kèm npm và yarn
- Go
- git
Verification Plan
Sau khi implement:
- kiểm tra cú pháp và nội dung Dockerfile mới
- build thử image bằng
docker build -f node-go.Dockerfile .nếu môi trường cho phép - xác nhận các binary chính tồn tại:
node --versiongo versiongit --version
Risks
- URL tải Go hoặc naming của tarball có thể đổi nếu
GO_VERSIONkhông hợp lệ - Mapping kiến trúc cần xử lý rõ để tránh build fail trên
arm64 - Nếu cần patch mới hơn trong cùng nhánh, phải nâng thủ công trong Dockerfile
Open Decisions Resolved
- Chọn cài Go từ tarball chính thức thay vì
apt - Giữ
node:lts-slimđể đồng nhất với repo hiện tại - Giữ image tối giản, không gộp thêm Docker CLI hoặc Python