CodeGym /Các khóa học /Docker SELF /Các chỉ dẫn cơ bản trong Dockerfile

Các chỉ dẫn cơ bản trong Dockerfile

Docker SELF
Mức độ , Bài học
Có sẵn

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, COPYCMD, đâ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ùng latest.
  • 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:

dockerfile


FROM ubuntu:20.04

Sử dụng image chính thức của Node.js:

dockerfile


FROM node:14

Sử dụng multi-stage build để tối ưu hóa:

dockerfile


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:

dockerfile


RUN apt-get update && apt-get install -y curl git

Biên dịch mã nguồn:

dockerfile


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.

dockerfile


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:

dockerfile


COPY . /app

Sao chép các tệp riêng lẻ:

dockerfile


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.

Text


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:

dockerfile


CMD ["node", "app.js"]

Khởi chạy script shell:

dockerfile


CMD /usr/bin/myscript.sh

Sự khác biệt giữa CMDENTRYPOINT

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:

dockerfile


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

dockerfile

        
# 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"]
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION