4.1 Cơ bản về lệnh docker build
Lệnh docker build
— là cách chính để tạo Docker-image từ Dockerfile. Nó thực hiện các hướng dẫn từ Dockerfile từng bước, tạo ra image từ các layer. Trong bài giảng này, tụi mình sẽ tìm hiểu cách mà lệnh docker build
hoạt động, những tham số mà nó có và cách sử dụng nó trong thực tế.
Lệnh docker build
tạo image từ Dockerfile và cái gọi là bối cảnh build (build context). Bối cảnh build — là các file mà Docker sử dụng để tạo image. Nó có thể là một thư mục cục bộ trên máy của bạn hoặc, ví dụ, một repository trên GitHub.
Cú pháp
docker build [OPTIONS] PATH | URL | -
Ở đây:
-
PATH
: đường dẫn tới thư mục chứa Dockerfile và bối cảnh build. URL
: địa chỉ URL của repository từ xa.-
: đọc Dockerfile từ đầu vào tiêu chuẩn (stdin).
Ví dụ sử dụng cơ bản
Trong ví dụ này, Docker sẽ sử dụng Dockerfile từ thư mục hiện tại (.)
và tạo ra một image với tên là myimage
và tag là latest
.
docker build -t myimage:latest .
4.2 Tuỳ chỉnh lệnh build
Các tham số chính của lệnh docker build
Lệnh docker build
hỗ trợ nhiều tuỳ chọn, cho phép điều chỉnh quy trình tạo.
1. Tham số -t
, --tag
Tham số -t
hoặc --tag
được dùng để gán tên và tag cho image được tạo.
docker build -t myimage:latest .
2. Tham số -f
, --file
Tham số -f
hoặc --file
cho phép chỉ định Dockerfile thay thế nếu nó khác với Dockerfile chuẩn.
docker build -f Dockerfile.dev -t myimage:dev .
3. Tham số --build-arg
Tham số --build-arg
được dùng để truyền các tham số build, được định nghĩa bằng chỉ thị ARG trong Dockerfile.
docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .
4. Tham số --no-cache
Tham số --no-cache
cho phép thực hiện build mà không sử dụng cache. Điều này hữu ích nếu cần đảm bảo mọi lệnh đều được thực thi lại.
docker build --no-cache -t myimage:latest .
5. Tham số --target
Tham số --target
được dùng để chỉ định giai đoạn mục tiêu trong build nhiều giai đoạn.
docker build --target builder -t myimage:builder .
6. Tham số --rm
Tham số --rm
yêu cầu Docker xóa các container trung gian sau khi tạo image thành công (theo mặc định được bật).
docker build --rm -t myimage:latest .
4.3 Ví dụ docker build
Ví dụ 1: Xây dựng cơ bản
Giả sử bạn có một ứng dụng đơn giản bằng Node.js, và bạn muốn tạo một Docker image để triển khai nó.
Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Câu lệnh build:
docker build -t mynodeapp:latest .
Trong ví dụ này, Docker sẽ tạo một image mynodeapp
với tag latest
, sử dụng Dockerfile từ thư mục hiện tại.
Ví dụ 2: Xây dựng với các tham số
Các tham số build cho phép truyền các biến vào Dockerfile trong quá trình build.
Dockerfile
FROM node:14
ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
Câu lệnh build:
docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .
Trong ví dụ này, tham số APP_VERSION
được truyền vào Dockerfile, cho phép chỉ định phiên bản ứng dụng trong quá trình build.
Ví dụ 3: Xây dựng nhiều giai đoạn
Xây dựng nhiều giai đoạn được sử dụng để tạo các image chỉ bao gồm các thành phần cần thiết. Điều này giúp giảm kích thước của image cuối cùng.
Dockerfile
# Giai đoạn xây dựng
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Tạo image cuối cùng với tập hợp file tối thiểu
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Câu lệnh build:
docker build -t mywebapp:latest .
Trong ví dụ này, đầu tiên tạo ra một image trung gian builder, trong đó ứng dụng được build. Sau khi build, ứng dụng được chuyển sang image cuối cùng, nơi Nginx được sử dụng để phục vụ nội dung đã chuẩn bị.
4.4 Các mẹo thực hành
1. Tối ưu hóa thứ tự các chỉ dẫn
Để sử dụng hiệu quả cache của Docker, việc sắp xếp đúng thứ tự các chỉ dẫn là rất quan trọng. Ví dụ, trước tiên hãy sao chép các file ít thay đổi, chẳng hạn như package.json
, để giảm thiểu việc rebuild dependency. Sau đó mới thực hiện sao chép các file còn lại.
COPY package*.json ./
RUN npm install
COPY . .
2. Sử dụng .dockerignore
Thêm file .dockerignore
để loại trừ các file và thư mục không cần thiết khỏi context build. Điều này sẽ giảm kích thước context và tăng tốc độ build image.
Ví dụ file .dockerignore
:
node_modules
dist
*.log
3. Build nhiều giai đoạn
Sử dụng kỹ thuật build nhiều giai đoạn để tạo các image nhẹ và tối giản. Phương pháp này cho phép bạn chỉ bao gồm những file và dependency cần thiết cho ứng dụng hoạt động, loại bỏ các dữ liệu thừa như file tạm thời hoặc mã nguồn khỏi image cuối cùng.
GO TO FULL VERSION