Mục tiêu
- Hiểu và thực hành cách tạo Docker Multi-Stage Builds để:
- Tối ưu kích thước image.
- Loại bỏ các layer trung gian không cần thiết (dependencies, source, tools…).
Multi-Stage Build là gì ?
- Sử dụng nhiều FROM trong 1 Dockerfile để tạo ra image cuối cùng nhẹ nhất.
- Các giai đoạn:
1. Build stage:**
- Cài dependencies, tải source, build và test.
- Thường dùng Node đầy đủ (như `node:14`).
2. Final stage:**
- Dùng image nhỏ hơn (như `node:alpine`).
- Chỉ copy artifact cần thiết từ build stage.
Cấu trúc mẫu Dockerfile multi-stage
## Build stage
FROM node:14 AS build
WORKDIR /var/node
COPY ./src .
RUN npm install
RUN npm run build
## Final image
FROM node:alpine
ARG VERSION=v1.1
LABEL app.version=$VERSION
ENV NODE_ENV=production
COPY --from=build /var/node /var/node
WORKDIR /var/node
EXPOSE 3000
ENTRYPOINT ["npm", "start"]
AS build: Đặt tên cho build stage.COPY --from=build: Chỉ copy kết quả cần thiết từ build stage.
Câu lệnh build image
docker image build -t linuxacademy/weather-app:multi-stage-build --build-arg VERSION=1.5 --rm .
-rm: Xóa container trung gian ngay khi build xong.-build-arg: Gán giá trị cho biến ARG trong Dockerfile.
Kết quả
- Image thành phẩm nhẹ hơn nhiều:
- Image multi-stage: ~90MB
- So với image cũ: ~1GB
- Tuy nhiên, image build stage có thể vẫn tồn tại:
- Dùng
docker image pruneđể dọn:
- Dùng
docker image prune -f
Tổng kết lệnh
| Câu lệnh | Mục đích |
|---|---|
FROM ... AS name | Đặt tên cho build stage |
COPY --from=name | Copy từ build stage |
--build-arg | Truyền giá trị cho ARG |
--rm | Xóa container trung gian sau khi build |
docker image prune | Xóa image trung gian, dangling |
Lợi ích:
- Image nhỏ gọn, nhanh deploy, giảm chi phí lưu trữ.
- Quản lý tốt hơn giữa môi trường build và production.