Công cụ tạo Dockerfile

Tạo Dockerfile sẵn sàng cho production với Node.js, Python, Go, Java, .NET, Rust hoặc trang tĩnh: build nhiều giai đoạn, người dùng non-root và .dockerignore đi kèm.

Dockerfile
.dockerignore

Trên production hãy cố định phiên bản hoặc digest của image và build lại định kỳ để nhận bản vá bảo mật.

Công cụ Liên quan

Xem Tất cả

Tạo Dockerfile là gì?

Tạo Dockerfile theo các best practice hiện hành cho Node.js, Python, Go, Java (Maven), .NET (ASP.NET Core), Rust hoặc trang tĩnh phục vụ bằng Nginx. Tùy chọn gồm build nhiều giai đoạn cho image nhỏ hơn, chạy bằng người dùng không phải root, phiên bản runtime, cổng và lệnh khởi chạy, đồng thời công cụ tạo luôn file .dockerignore tương ứng.

Cách sử dụng Tạo Dockerfile

  1. Chọn Ngôn ngữ / stack.
  2. Đặt Phiên bản runtime (tag image), Cổng và tên file khởi chạy, module, JAR hoặc file thực thi.
  3. Giữ đánh dấu Build nhiều giai đoạn và Chạy bằng người dùng không phải root trừ khi có lý do khác.
  4. Tải Dockerfile và .dockerignore vào thư mục gốc dự án rồi chạy docker build -t myapp ..

Ví dụ

Đầu vào
Node.js 22, port 3000, start file dist/index.js, multi-stage, non-root, npm run build
Đầu ra
# syntax=docker/dockerfile:1

# ---- dependencies (production only) ----
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev

# ---- build ----
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build

# ---- runtime ----
FROM node:22-alpine
ENV NODE_ENV=production
WORKDIR /app
COPY --from=deps --chown=node:node /app/node_modules ./node_modules
COPY --from=build --chown=node:node /app/dist ./dist
COPY --chown=node:node package.json ./
# The official Node images ship an unprivileged "node" user
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

Khi nào nên dùng Tạo Dockerfile

Dùng để nhanh chóng container hóa một web service hoặc API thông thường với mặc định hợp lý. Hãy xem lại file được tạo cho phù hợp với dự án: lệnh build, thư mục kết quả và entry point thay đổi tùy dự án, và dependency native có thể cần thêm gói hệ thống. Hãy ghim chính xác phiên bản hoặc digest của image để build production có thể tái lập.

Tạo Dockerfile hoạt động như thế nào

Mỗi stack có một template viết cho image chính thức của nó. Build nhiều giai đoạn cài đặt và biên dịch trong image SDK đầy đủ rồi chỉ sao chép kết quả sang runtime gọn nhẹ: Node cài dependency production bằng npm ci --omit=dev ở một giai đoạn riêng; Python dựng virtualenv rồi sao chép vào python:<ver>-slim; Go biên dịch binary tĩnh (CGO_ENABLED=0, -trimpath -ldflags="-s -w") vào distroless/static:nonroot; Java sao chép JAR vào image Temurin chỉ có JRE; .NET publish vào image runtime aspnet và dùng người dùng $APP_UID có sẵn; Rust sao chép binary release vào debian:bookworm-slim. Chế độ non-root dùng người dùng không đặc quyền có sẵn của image (node, nonroot, app) hoặc tạo người dùng mới với UID 10001. File khai báo dependency được sao chép trước mã nguồn để cache layer của Docker bỏ qua bước cài lại khi chỉ có mã thay đổi.

Các Trường Hợp Sử Dụng Phổ Biến

  • Container hóa API Node.js hoặc Python để triển khai
  • Thu nhỏ image dịch vụ Go bằng runtime distroless
  • Phục vụ bản build React/Vue/Astro bằng Nginx non-root
  • Giảng dạy hoặc review các best practice của Dockerfile

Lưu Ý Bảo Mật

Đừng bao giờ COPY file .env hay thông tin xác thực vào image; hãy truyền bí mật lúc chạy hoặc bằng secret mount của BuildKit.

Câu Hỏi Thường Gặp

Vì sao nên dùng build nhiều giai đoạn?

Trình biên dịch, dependency phát triển và mã nguồn ở lại giai đoạn build, nên image cuối nhỏ hơn, khởi động nhanh hơn và ít gói có thể chứa lỗ hổng hơn.

Vì sao nên chạy bằng người dùng không phải root?

Nếu ứng dụng bị xâm nhập, kẻ tấn công không có quyền root bên trong container, giúp hạn chế thiệt hại và chặn một số kỹ thuật thoát khỏi container.

.dockerignore dùng để làm gì?

Nó loại các file như node_modules, .git và .env khỏi build context, giúp build nhanh hơn và giữ bí mật ngoài image.

Khám phá thêm danh mục