Trình tạo Dockerfile

Dockerfile
Kết quả

Dockerfile là một trong những file trông có vẻ ngắn cho đến khi bạn nhớ ra các chi tiết: thứ tự layer quan trọng với cache, COPY package.json phải đặt trước RUN npm install, và ngôn ngữ biên dịch hưởng lợi từ build đa giai đoạn. Trình tạo này viết ra Dockerfile sẵn dùng cho công nghệ bạn chọn, với mô hình cache đã đúng ngay từ đầu.

Cách tạo Dockerfile

  1. 1

    Chọn công nghệ

    Node.js, Python, PHP, Go hoặc Rust. Mỗi mẫu dùng image gốc phù hợp với ngôn ngữ đó và lệnh cài dependency đúng.

  2. 2

    Đặt thư mục làm việc và cổng

    Chọn WORKDIR và cổng mà ứng dụng của bạn lắng nghe; cả hai được ghi vào file tạo ra.

  3. 3

    Xem lại Dockerfile

    Kiểm tra dòng EXPOSE và lệnh khởi động khớp với ứng dụng của bạn. Mẫu Go và Rust dùng build đa giai đoạn.

  4. 4

    Sao chép Dockerfile

    Sao chép kết quả dán vào thư mục gốc kho lưu trữ, sau đó build image.

Vì sao build đa giai đoạn

Một Dockerfile đơn giản cài toàn bộ bộ công cụ biên dịch vào image cuối. Build đa giai đoạn cho bạn một giai đoạn “builder” để biên dịch và một giai đoạn cuối chỉ chứa sản phẩm đã biên dịch:

FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

Image cuối loại bỏ mọi dependency phát triển, file mã nguồn và cache build, thường giúp giảm kích thước image 60-80 phần trăm.

Các biến thể image gốc

Các mẫu dùng image slim hoặc alpine khi có thể. Nếu bạn tự điều chỉnh image gốc, các lựa chọn tiêu biểu là:

Biến thể Kích thước thường Khi nào chọn
full 300-900 MB Image phát triển, dependency hệ thống bất thường
slim 80-200 MB Tiêu chuẩn production cho hầu hết ngôn ngữ
alpine 30-100 MB Image nhỏ, lưu ý vấn đề glibc so với musl
distroless 20-80 MB Bảo mật tối đa; không shell, không trình quản lý gói

Quy tắc cache layer

Docker cache từng dòng; khi một layer thay đổi, mọi thứ bên dưới được build lại. Thứ tự từ ít thay đổi đến nhiều thay đổi:

  1. Image gốc FROM (hiếm khi đổi).
  2. Gói hệ thống (apt-get install), ít thay đổi.
  3. Tệp manifest dependency (package.json, requirements.txt, composer.json).
  4. Bước cài dependency. Chỉ chạy khi manifest thay đổi.
  5. Sao chép mã nguồn. Layer bận nhất; mọi thứ sau nó được build lại ở mỗi commit.
  6. Biên dịch và CMD cuối.

Phá vỡ thứ tự này là lý do phổ biến nhất khiến build CI chậm.

Danh sách kiểm tra bảo mật

  • Chạy với quyền không phải root. Đặt USER appuser (hoặc USER 1000) gần cuối.
  • Ghim phiên bản. python:3.12.7-slim hơn python:3.12, và hơn cả python:latest.
  • Đặt WORKDIR tường minh thay vì dựa vào /.
  • Dùng COPY chứ không dùng ADD cho file cục bộ; ADD có tác dụng phụ tự giải nén.
  • Thêm HEALTHCHECK để bộ điều phối phát hiện tiến trình bị kẹt.
  • Dọn cache gói trong cùng dòng RUN: apt-get install ... && rm -rf /var/lib/apt/lists/*.

Câu hỏi thường gặp

Slim là lựa chọn mặc định an toàn hơn vì vẫn dựa trên glibc, giống hầu hết wheel biên dịch sẵn của các thư viện. Alpine dùng musl và đôi khi gây lỗi runtime khó hiểu trong Python (pandas, numpy) hoặc Node (module native node-gyp). Chọn alpine khi kích thước image là yếu tố quan trọng và bạn đã thử nghiệm công nghệ.

Có, hãy thêm một file vào dự án. Không có nó, Docker gửi toàn bộ kho lưu trữ của bạn đến daemon làm build context: lịch sử git, node_modules, file .env cục bộ, bài kiểm tra. Điều đó chậm, lãng phí cache và rò rỉ bí mật.

Có. Dùng docker buildx với tùy chọn --platform để build cho cả hai kiến trúc cùng lúc. Các image gốc mà mẫu sử dụng đều phát hành biến thể arm64.

Không. Công nghệ, thư mục làm việc và cổng đã chọn chỉ dùng để tạo Dockerfile trên trang này; không có gì được lưu trữ hay chia sẻ.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác