diff --git a/README.md b/README.md index 6d25a2d..1f80b2a 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,16 @@ Kho lưu trữ này cung cấp các Docker base image cho nhiều mục đích s - **git** - **python v3.11** +- **node-go** + - `git.thuanle.me/public/base:node-go-latest` + - Dockerfile: [node-go.Dockerfile](node-go.Dockerfile) + - Các gói/phần mềm đã cài đặt: + - **Node.js** kèm theo **npm** và **yarn** + - **git** + - **Go 1.26** + - Ghi chú: + - `GO_VERSION` hiện được giữ ở mức `1.26` và sẽ nâng thủ công khi cần + ## Update -- Repo được update hàng tuần. \ No newline at end of file +- Repo được update hàng tuần. diff --git a/docs/superpowers/specs/2026-04-27-node-go-design.md b/docs/superpowers/specs/2026-04-27-node-go-design.md index c9a95d7..eaec66d 100644 --- a/docs/superpowers/specs/2026-04-27-node-go-design.md +++ b/docs/superpowers/specs/2026-04-27-node-go-design.md @@ -14,6 +14,7 @@ Mục tiêu của thay đổi này là bổ sung thêm một base image mới ch - 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 @@ -42,7 +43,7 @@ Nhược điểm: Ưu điểm: -- Kiểm soát version Go rõ ràng bằng biến môi trường +- 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 @@ -61,6 +62,7 @@ Image mới sẽ: - 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_VERSION` là `major.minor`, tải bản `.0` tươ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/bin` vào `PATH` @@ -82,10 +84,11 @@ Tạo file `node-go.Dockerfile` với cấu trúc gần giống các Dockerfile 5. Dùng `dpkg --print-architecture` để map: - `amd64` -> `linux-amd64` - `arm64` -> `linux-arm64` -6. Tải tarball Go tương ứng, giải nén vào `/usr/local` -7. Xóa file tạm và cache `apt` -8. Khai báo `PATH=/usr/local/go/bin:${PATH}` -9. Giữ `WORKDIR /app` +6. Nếu `GO_VERSION` là `major.minor`, map sang `.0` để tạo version tải cụ thể +7. Tải tarball Go tương ứng, giải nén vào `/usr/local` +8. Xóa file tạm và cache `apt` +9. Khai báo `PATH=/usr/local/go/bin:${PATH}` +10. Giữ `WORKDIR /app` ### README @@ -113,7 +116,7 @@ Sau khi implement: - URL tải Go hoặc naming của tarball có thể đổi nếu `GO_VERSION` không hợp lệ - Mapping kiến trúc cần xử lý rõ để tránh build fail trên `arm64` -- Nếu không pin `GO_VERSION`, output build có thể thay đổi theo thời gian; vì vậy nên khai báo version tường minh +- 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 diff --git a/node-go.Dockerfile b/node-go.Dockerfile new file mode 100644 index 0000000..dbd5ecd --- /dev/null +++ b/node-go.Dockerfile @@ -0,0 +1,28 @@ +FROM node:lts-slim + +ARG GO_VERSION=1.26 + +ENV DEBIAN_FRONTEND=noninteractive \ + PATH=/usr/local/go/bin:${PATH} + +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends ca-certificates curl git; \ + arch="$(dpkg --print-architecture)"; \ + case "${arch}" in \ + amd64) go_arch='linux-amd64' ;; \ + arm64) go_arch='linux-arm64' ;; \ + *) echo "Unsupported architecture: ${arch}" >&2; exit 1 ;; \ + esac; \ + case "${GO_VERSION}" in \ + *.*.*) download_go_version="${GO_VERSION}" ;; \ + *.*) download_go_version="${GO_VERSION}.0" ;; \ + *) echo "GO_VERSION must be major.minor or major.minor.patch: ${GO_VERSION}" >&2; exit 1 ;; \ + esac; \ + curl -fsSL "https://go.dev/dl/go${download_go_version}.${go_arch}.tar.gz" -o /tmp/go.tgz; \ + rm -rf /usr/local/go; \ + tar -C /usr/local -xzf /tmp/go.tgz; \ + rm -f /tmp/go.tgz; \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /app