3.1 Hướng dẫn FROM
Thế nhé, nhớ lại, Dockerfile — là một file văn bản chứa các hướng dẫn để tạo Docker image. Mỗi hướng dẫn trong Dockerfile thực hiện một nhiệm vụ cụ thể và tạo một lớp mới trong image. Trong bài giảng này, tụi mình sẽ đào sâu hơn các hướng dẫn chính của Dockerfile: FROM
, RUN
, COPY
và CMD
, đây là những phần cốt lõi để tạo ra các Docker image hoạt động tốt và hiệu quả.
Hướng dẫn FROM
đặt image cơ bản, từ đó sẽ tạo ra một image mới. Đây là hướng dẫn đầu tiên trong bất kỳ Dockerfile nào, và nó xác định điểm bắt đầu cho quá trình build image.
Cú pháp
FROM <image>[:<tag>] [AS <name>]
Nơi:
<image>
: tên của image cơ bản.<tag>
: (không bắt buộc) phiên bản của image cơ bản. Mặc định sẽ dùnglatest
.AS <name>
: (không bắt buộc) đặt tên cho giai đoạn build này (được sử dụng trong multi-stage build).
Ví dụ
Sử dụng image cơ bản Ubuntu
:
FROM ubuntu:20.04
Sử dụng image chính thức của Node.js
:
FROM node:14
Sử dụng multi-stage build để tối ưu hóa:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Trong ví dụ này, sử dụng hai image cơ bản. Đầu tiên (node:14) được dùng để build ứng dụng, thứ hai (nginx:alpine) — để tạo máy chủ nhẹ, dùng để phục vụ các file tĩnh.
Nhờ việc sử dụng multi-stage build, image cuối cùng chỉ chứa một tập hợp nhỏ các file và chương trình (trong trường hợp này là Nginx
và các file tĩnh đã được build), điều này làm cho nó nhẹ và nhanh hơn để triển khai.
3.2 Lệnh RUN
Lệnh RUN
thực thi các lệnh bên trong container và tạo một layer mới trong image. Lệnh này được sử dụng để cài đặt các gói, thiết lập môi trường và thực thi các lệnh khác cần thiết để chuẩn bị image.
Cú pháp:
RUN <command>
Trong đó:
<command>
: lệnh sẽ được thực thi bên trong container.
Ví dụ:
Cài đặt các gói trong image Ubuntu:
RUN apt-get update && apt-get install -y curl git
Biên dịch mã nguồn:
RUN gcc -o myapp myapp.c
Kết hợp nhiều lệnh
Để giảm số lượng layer, kích thước image
nhỏ hơn và tăng tốc độ build, nên kết hợp nhiều lệnh trong một lệnh RUN
.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Lệnh COPY
Lệnh COPY
sao chép các tệp và thư mục từ context build vào hệ thống tệp của container. Điều này hữu ích để mang mã nguồn, tệp cấu hình và các tài nguyên khác vào container.
Cú pháp:
COPY <src> <dest>
Trong đó:
-
<src>
: đường dẫn đến các tệp hoặc thư mục trong context build. <dest>
: đường dẫn đích trong container.
Ví dụ:
Sao chép toàn bộ nội dung của thư mục hiện tại vào thư mục làm việc của container:
COPY . /app
Sao chép các tệp riêng lẻ:
COPY package.json /app/package.json
COPY server.js /app/server.js
Sử dụng .dockerignore
Để loại trừ các tệp không cần thiết khỏi quá trình sao chép, bạn có thể sử dụng tệp .dockerignore
, hoạt động tương tự như .gitignore
.
node_modules
dist
*.log
3.4 Chỉ thị CMD
Chỉ thị CMD
định nghĩa lệnh sẽ được thực thi khi container khởi chạy. Khác với RUN
, được thực thi trong quá trình build, CMD
thực thi khi container được khởi tạo từ image đã tạo.
Cú pháp:
CMD ["executable","param1","param2"]
Hoặc
CMD command param1 param2
Nơi:
- ["executable","param1","param2"]: dạng exec, được ưu tiên để đảm bảo xử lý tín hiệu chính xác.
- command param1 param2: dạng
shell
, thực thi lệnh trong shell.
Ví dụ:
Khởi chạy ứng dụng Node.js
:
CMD ["node", "app.js"]
Khởi chạy script shell
:
CMD /usr/bin/myscript.sh
Sự khác biệt giữa CMD
và ENTRYPOINT
CMD
định nghĩa lệnh mặc định, có thể bị ghi đè khi khởi chạy container. ENTRYPOINT
định nghĩa một lệnh bất biến, luôn được thực thi khi container khởi chạy.
Ví dụ sử dụng ENTRYPOINT
:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
Trong ví dụ này, ENTRYPOINT
khởi động script Python, còn CMD
truyền các tham số, có thể thay đổi khi chạy container.
Ví dụ Dockerfile với các chỉ thị cơ bản
# Sử dụng image Node.js cơ bản
FROM node:14
# Thiết lập thư mục làm việc
WORKDIR /app
# Sao chép các file package.json và package-lock.json
COPY package*.json ./
# Cài đặt dependencies
RUN npm install
# Sao chép mã nguồn ứng dụng
COPY . .
# Chỉ định cổng ứng dụng sẽ sử dụng
EXPOSE 3000
# Định nghĩa lệnh để khởi chạy ứng dụng
CMD ["node", "app.js"]
GO TO FULL VERSION