Chuyển đến nội dung chính

Giải thích Docker ENTRYPOINT: Cách dùng, Cú pháp và Thực tiễn tốt nhất

Nắm vững Docker ENTRYPOINT với cú pháp exec vs. shell, cách dùng CMD, ghi đè lúc chạy, và ví dụ thực tế. Xây dựng container rõ ràng, đáng tin cậy hơn ngay hôm nay.
· 8 phút đọc

Khám phá cùng AI

Docker ENTRYPOINT là một chỉ thị trong Dockerfile, xác định và kiểm soát lệnh mặc định được thực thi mỗi khi container của bạn khởi động. Thành thạo ENTRYPOINT giúp đơn giản hóa việc phát triển các container có hành vi dự đoán được, có thể tái lập và dễ bảo trì. 

Hướng dẫn này nhằm giúp các kỹ sư DevOps tầm trung, lập trình viên backend, và kỹ sư phần mềm sử dụng ENTRYPOINT một cách tự tin và tránh những sai sót thường gặp.

Nếu bạn mới làm quen với Docker, hãy xem phần giới thiệu hướng dẫn Docker của chúng tôi, vì bài này giả định bạn đã có một mức độ hiểu biết nhất định về Docker. Để thực hành Docker, hãy tham khảo khóa học Introduction to Docker. 

Docker ENTRYPOINT là gì?

ENTRYPOINT xác định lệnh được thực thi theo mặc định mỗi khi container Docker của bạn khởi chạy. Khác với CMD, chỉ thị ENTRYPOINT đảm bảo tính nhất quán bằng cách cung cấp các lệnh chạy mọi lần container khởi động.

Docker ENTRYPOINT hoạt động như thế nào?

ENTRYPOINT trong Dockerfile định nghĩa lệnh chính luôn chạy khi bạn khởi động một container từ image. Nó giống như nói: “Bất kể người dùng truyền đối số gì khi chạy container này, luôn bắt đầu với lệnh này.”

Chúng tôi đi sâu hơn về Dockerfile trong bài hướng dẫn Cách đóng gói ứng dụng bằng Docker. 

Ví dụ, trong một Dockerfile:

ENTRYPOINT ["python", "app.py"]

Bây giờ, khi bạn chạy:

docker run myimage

Nó sẽ luôn thực thi:

python app.py

Sau đây là sơ đồ luồng cho cách ENTRYPOINT hoạt động:

+---------------------------+

|       Dockerfile          |

+---------------------------+

|                           |

|  ENTRYPOINT ["app"]       |

|  CMD ["--default-arg"]    |

+---------------------------+

             |

             v

+---------------------------+

|   Build Docker Image      |

+---------------------------+

             |

             v

+---------------------------+

|    Run Container          |

|   (docker run image)      |

+---------------------------+

             |

             v

+---------------------------+

| Executed Command:         |

|   app --default-arg       |

+---------------------------+

Override CMD at Runtime:

(docker run image --custom-arg)

             |

             v

+---------------------------+

| Executed Command:         |

|   app --custom-arg        |

+---------------------------+

Override ENTRYPOINT at Runtime:

(docker run --entrypoint /bin/bash image)

             |

             v

+---------------------------+

| Executed Command:         |

|   /bin/bash               |

+---------------------------+

Các nguyên lý cơ bản của Docker ENTRYPOINT

Hiểu vững nền tảng sẽ giúp bạn tự tin hơn nhiều khi sử dụng ENTRYPOINT một cách hiệu quả.

Khung khái niệm

ENTRYPOINT chỉ định executable hoặc script chạy tự động khi container của bạn khởi động. Đó là tiến trình chính của container, điều khiển hành vi của container một cách có thể dự đoán.

Cú pháp cốt lõi

Cú pháp Dockerfile cho ENTRYPOINT đơn giản và thường dùng cùng với CMD để cung cấp đối số hoặc tham số mặc định. ENTRYPOINT định nghĩa executable, trong khi CMD chỉ định các đối số mặc định mà ENTRYPOINT sử dụng.

Hiểu các khái niệm Docker như ENTRYPOINT rất quan trọng để vượt qua phỏng vấn khoa học dữ liệu. Khám phá các câu hỏi phổ biến trong bài 26 câu hỏi và trả lời phỏng vấn Docker hàng đầu cho năm 2025. 

Các dạng cú pháp ENTRYPOINT

Docker ENTRYPOINT có hai dạng riêng biệt: shell và exec. Biết sự khác nhau giữa hai dạng này sẽ giúp bạn lựa chọn phù hợp.

Dạng shell

Ví dụ cú pháp: 

ENTRYPOINT /usr/bin/ping -c 3 localhost

Dạng shell cho phép tích hợp dễ dàng các tính năng của shell (thay thế biến, thao tác môi trường).

Tuy nhiên, nó có thể dẫn đến việc xử lý tín hiệu kém; lệnh chạy bên trong một tiến trình trung gian /bin/sh thay vì trực tiếp là PID 1, gây ra vấn đề khi dừng và khởi động lại container.

PID 1 là tiến trình đầu tiên được khởi chạy trong quá trình boot hệ thống. Trong Docker, tiến trình PID 1 quản lý tất cả các tiến trình khác bên trong container. 

Dạng exec

Ví dụ cú pháp: 

ENTRYPOINT ["/usr/bin/ping", "-c", "3"]

Dạng Exec đảm bảo thực thi lệnh trực tiếp dưới dạng PID 1, giúp xử lý tín hiệu và kiểm soát đáng tin cậy.

Tuy nhiên, nó không hỗ trợ shell trực tiếp hoặc tự động mở rộng biến môi trường; cần thêm script để có hành vi giống shell.

ENTRYPOINT vs CMD: Khác biệt chính và trường hợp sử dụng

Phân biệt ENTRYPOINT với CMD giúp tránh nhầm lẫn và đảm bảo hành vi container có thể dự đoán.

Thứ tự ưu tiên thực thi

ENTRYPOINT đặt executable luôn chạy, còn CMD cung cấp đối số mặc định. Nếu cả ENTRYPOINT và CMD đều được định nghĩa, ENTRYPOINT có ưu tiên và thực thi với các giá trị từ CMD làm đối số, trừ khi bị ghi đè rõ ràng lúc chạy.

Kịch bản sử dụng

ENTRYPOINT nên dùng khi bạn muốn hành vi thực thi nhất quán, được áp đặt mỗi lần khởi chạy, như các container chạy một lệnh duy nhất hoặc script bọc quanh ứng dụng kế thừa. Ngược lại, CMD phù hợp để chỉ định các đối số mặc định, cho phép linh hoạt hơn với việc ghi đè lúc chạy.

Tính năng

ENTRYPOINT

CMD

Mục đích

Executable luôn chạy

Đối số mặc định

Có thể ghi đè?

Chỉ với docker run --entrypoint

Có, bằng đối số dòng lệnh

Dùng kết hợp

CMD cung cấp đối số cho ENTRYPOINT

Bị bỏ qua nếu truyền lệnh lúc chạy

Cách dùng điển hình

Hành vi cố định (ví dụ: chạy ứng dụng)

Cấu hình tùy chọn (ví dụ: cờ mặc định)

Bài 18 lệnh Docker hàng đầu để xây, chạy và quản lý container bao quát các lệnh thiết yếu của Docker, từ những khái niệm cơ bản về container đến volumes và networking, giúp bạn tự tin quản lý ứng dụng trên nhiều môi trường.

Ví dụ thực tiễn

Một sự kết hợp điển hình của ENTRYPOINT và CMD được minh họa trong Dockerfile sau:

FROM ubuntu
ENTRYPOINT ["/usr/bin/ping", "-c", "3"]
CMD ["localhost"]

Container Docker này luôn gửi ba gói ping theo mặc định tới localhost. Người dùng có thể ghi đè mục tiêu mặc định này lúc chạy với các host khác một cách dễ dàng, vẫn giữ được tính dự đoán trong thực thi của ENTRYPOINT:

docker run ping-container google.com

Bạn có thể tìm hiểu thêm về triển khai ứng dụng với Docker từ khóa học Containerization and Virtualization with Docker and Kubernetes. 

Kết hợp ENTRYPOINT với CMD

Kết hợp đúng cách ENTRYPOINT với CMD mang đến sự linh hoạt mà không đánh đổi tính nhất quán.

CMD làm đối số mặc định

Thiết lập ENTRYPOINT sẽ định nghĩa đáng tin cậy lệnh chính; CMD cung cấp tham số mặc định để dễ dàng ghi đè mà không cần xây dựng lại image.

Ghi đè đối số lúc chạy

Các đối số chỉ định trong docker run chỉ ghi đè các mặc định do CMD định nghĩa. ENTRYPOINT vẫn nhất quán, giúp trải nghiệm người dùng đơn giản hơn.

Ghi đè ENTRYPOINT lúc chạy

Docker cho phép ghi đè ENTRYPOINT trực tiếp lúc chạy, hỗ trợ gỡ lỗi mà không cần xây dựng lại image từ Dockerfile.

Cách dùng cờ entrypoint

Docker cung cấp cờ đơn giản --entrypoint để thay đổi tạm thời hành vi container.

docker run -it --entrypoint /bin/bash my-container

Ghi đè tạm thời cho phép xử lý sự cố bằng shell, giải quyết các vấn đề khởi động thường gặp mà không cần dựng lại image hay mất nhiều thời gian.

Tùy biến hành vi ENTRYPOINT

Docker cung cấp sự linh hoạt khi ENTRYPOINT cần tùy biến nâng cao.

Ghi đè ENTRYPOINT lúc chạy

Bạn có thể ghi đè lệnh ENTRYPOINT một cách linh hoạt lúc chạy bằng docker run --entrypoint để gỡ lỗi hoặc thay đổi ngữ cảnh nhanh chóng mà không phải sửa Dockerfile nhiều lần.

ENTRYPOINT với đối số

Các đối số truyền vào container sẽ trở thành tham số của ENTRYPOINT lúc chạy; thực tiễn tốt nhất là giữ ENTRYPOINT đơn giản và dùng CMD để tối đa hóa độ rõ ràng và khả năng kiểm soát.

Script bọc (wrapper)

Các script Bash dùng làm lệnh ENTRYPOINT có thể thực thi logic khởi động có điều kiện, chờ các dịch vụ phụ thuộc (như cơ sở dữ liệu), xử lý tác vụ thiết lập, v.v., đồng thời giữ cú pháp Dockerfile gọn gàng.

Ví dụ và mẫu hình trong thực tế

Các ứng dụng ENTRYPOINT thực tế có thể minh họa những cách dùng phổ biến, sát với tình huống thật. Hãy cùng xem một vài ví dụ.

Container chạy một lệnh duy nhất 

Với thiết lập ứng dụng Flask:

FROM python:3.11-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["python", "app.py"]
CMD ["--port", "8080"]

Trong Dockerfile trên:

  • ENTRYPOINT ["python", "app.py"]  đặt executable mặc định. Đây là những gì chạy khi container khởi động.
  • CMD ["--port", "8080"]  cung cấp các đối số mặc định (--port 8080) cho lệnh ENTRYPOINT.

Lệnh mặc định đầy đủ được thực thi sẽ là:

python app.py --port 8080

 Nếu bạn ghi đè CMD khi chạy container (ví dụ, docker run myimage --port 9090), nó sẽ thay thế --port 8080.

Dùng script làm ENTRYPOINT 

Cách này dùng để thiết lập logic có điều kiện: 

entrypoint.sh:

#!/bin/sh
until nc -z db_host 5432; do
  echo "Waiting for database to become available."
  sleep 2
done
exec python app.py "$@"

Dockerfile:

FROM python:3.11-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
CMD ["--port", "8080"]

Trong các tệp trên:

  • entrypoint.sh được dùng để chờ kết nối cơ sở dữ liệu.
  • exec python app.py "$@"  thay thế tiến trình shell hiện tại bằng python app.py, truyền mọi đối số bổ sung. "$@" đến từ tham số CMD hoặc docker run.
  • COPY entrypoint.sh  sao chép script entrypoint.sh vào thư mục /app của container.
  • ENTRYPOINT ["./entrypoint.sh"] đặt entrypoint.sh là script khởi động mặc định khi container chạy.
  • CMD ["--port", "8080"] cung cấp các đối số mặc định sẽ được truyền cho script entrypoint.sh và cuối cùng là python app.py. Lệnh thực thi cuối cùng sẽ trông như: python app.py --port 8080. 

Xử lý tín hiệu và PID 1

Dạng của ENTRYPOINT ảnh hưởng lớn đến khả năng Docker xử lý tín hiệu do tầm quan trọng của PID 1. Hãy tìm hiểu chi tiết hơn: 

Dạng exec và PID 1

Dạng exec chạy lệnh trực tiếp như tiến trình PID 1 của Docker, cải thiện độ tin cậy trong chuyển tiếp tín hiệu và hành vi dừng/khởi động lại đúng cách.

Hạn chế của dạng shell

Dạng shell thêm một tiến trình shell trung gian. Điều này ngăn các tín hiệu kết thúc đến được tiến trình ứng dụng, tạo rủi ro container bị treo hoặc không phản hồi.

Gỡ lỗi hành vi ENTRYPOINT

Khắc phục sự cố cấu hình entrypoint sẽ dễ dàng hơn với một số kỹ thuật và mẹo. Hãy khám phá bên dưới. 

Dùng --entrypoint để gỡ lỗi

Ghi đè tạm thời giúp nhanh chóng bật shell tương tác trong container của bạn mà không cần dựng lại image. Điều này cho phép bạn thử nghiệm nhiều thứ trong ứng dụng mà không phải dựng lại image. 

Xem nhật ký ENTRYPOINT

Kiểm tra log đầu ra với docker logs giúp đơn giản hóa việc truy vết lịch sử thực thi và tìm ra vấn đề cấu hình một cách rõ ràng, nhanh chóng.

Tránh sửa Dockerfile cho việc thử nghiệm tạm thời

Ghi đè ENTRYPOINT thân thiện cho gỡ lỗi lúc chạy cho phép bạn cô lập và khắc phục sự cố mà không phải sửa và dựng lại image nhiều lần.

Kỹ thuật tối ưu hóa và thực tiễn tốt nhất

Dưới đây là một số tối ưu khuyến nghị để cải thiện độ tin cậy và khả năng bảo trì của ENTRYPOINT.

Dùng dạng exec để xử lý tín hiệu

Luôn ưu tiên dạng exec để có tín hiệu kết thúc đúng cách và độ tin cậy, khả năng quản lý container tốt hơn.

Kết hợp ENTRYPOINT và CMD hiệu quả

Tách executable (ENTRYPOINT) khỏi các đối số mặc định lúc chạy (CMD) và tận dụng ghi đè lúc chạy để tối đa hóa tính linh hoạt và dễ quản lý.

Giảm độ phức tạp trong ENTRYPOINT

Giữ ENTRYPOINT đơn giản, chuyển logic khởi động phức tạp hoặc có điều kiện sang các script riêng để quản lý độ phức tạp tốt hơn và tăng tính rõ ràng.

Các trường hợp sử dụng và mẫu hình nâng cao

Hãy khám phá một số trường hợp sử dụng và mẫu hình ENTRYPOINT nâng cao.

Build đa giai đoạn với ENTRYPOINT

ENTRYPOINT trong các giai đoạn cuối của Docker đảm bảo thực thi đáng tin cậy, mang lại các bản build sạch hơn, điều chỉnh riêng cho các tác vụ sản xuất trong quy trình CI/CD.

Script ENTRYPOINT linh động

Các script ENTRYPOINT có thể điều chỉnh động logic khởi động theo biến môi trường hoặc đối số lúc chạy, thích ứng linh hoạt với các bối cảnh ứng dụng khác nhau.

ENTRYPOINT cho pipeline CI/CD

Tận dụng ENTRYPOINT  cải thiện tính nhất quán giữa môi trường kiểm thử và sản xuất, đảm bảo hành vi lúc chạy có thể dự đoán và tái lập. Ví dụ, bạn có thể đặt ENTRYPOINT thành một script tự động chạy kiểm thử. 

Các ứng dụng khác bao gồm: 

  • Một ENTRYPOINT chờ cơ sở dữ liệu, sau đó chạy migration, và cuối cùng khởi động app.
  • Một ENTRYPOINT tự động biên dịch asset, lint mã, hoặc xác thực cấu hình.
  • Các script ENTRYPOINT có thể phát hiện môi trường (dev, staging, production) và điều chỉnh thiết lập tương ứng khi container khởi động. 

Đây là ví dụ về một image Docker tự động chạy kiểm thử:

FROM python:3.11
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["pytest"]

.gitlab-ci.yml sẽ trông như sau:

build-test:
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t myapp-test .
    - docker run myapp-test  # <-- No need to specify 'pytest', ENTRYPOINT does it

Khi docker run thực thi, nó tự động kích hoạt pytest bên trong container. Điều này đảm bảo mọi bài kiểm thử được phát hiện và chạy ngay lập tức. 

Có một số lợi thế khi dùng ENTRYPOINT trong CI/CD:

  • Mỗi container khởi động và hoạt động theo cùng một cách. 
  • Đơn giản hóa script CI/CD vì bạn không phải truyền đầy đủ lệnh mỗi lần. 
  • Tự động hóa kiểm tra trước khi khởi động, chạy test và migration, giảm lỗi do con người. 

Những sai sót thường gặp và cách khắc phục

ENTRYPOINT có một vài cạm bẫy bạn nên tránh trong quy trình làm việc.

Lạm dụng dạng shell

Dạng shell cản trở tín hiệu và công cụ quản lý container; luôn ưu tiên dạng exec để xử lý tín hiệu đúng, container thoát và dừng gọn gàng.

Làm ENTRYPOINT quá phức tạp

Những script phức tạp, thiếu rõ ràng hoặc thiếu tin cậy càng gây khó khăn hơn khi gỡ lỗi hoặc bảo trì lâu dài. Thiết lập ENTRYPOINT đơn giản sẽ giúp việc xử lý sự cố dễ dàng hơn đáng kể.

Kết luận

Hiểu và triển khai hiệu quả Docker ENTRYPOINT giúp xây dựng các container Docker dự đoán được, tin cậy và dễ bảo trì cho ứng dụng của bạn. Nếu dùng đúng cách, ENTRYPOINT tạo ra tính nhất quán mà không đánh mất sự linh hoạt nhờ hệ thống ghi đè mạnh mẽ của Docker. Thử nghiệm thận trọng với các mẫu ENTRYPOINT, tuân theo các thực tiễn tốt nhất nêu trên, sẽ đơn giản hóa việc sử dụng Docker và dẫn đến chu kỳ triển khai, quản lý trơn tru hơn trong môi trường sản xuất.

Xem thêm các khóa học Docker của chúng tôi để khám phá thêm các chủ đề như:

Derrick Mwiti

Tác giả

Derrick Mwiti

Câu hỏi thường gặp về Docker ENTRYPOINT

Sự khác nhau giữa ENTRYPOINT và CMD trong Dockerfile là gì?

ENTRYPOINT xác định lệnh chính luôn chạy khi container khởi động. CMD cung cấp các đối số mặc định cho lệnh đó. Nếu dùng cả hai, các giá trị CMD sẽ được truyền cho ENTRYPOINT trừ khi bị ghi đè lúc chạy.

Khi nào tôi nên dùng dạng exec so với dạng shell của ENTRYPOINT?

Dùng dạng exec (ví dụ, ["app", "arg1"]) khi bạn cần xử lý tín hiệu đúng và thực thi trực tiếp ở PID 1. Dạng shell (ví dụ, "app arg1") bị hạn chế vì nó khởi chạy một shell có thể không chuyển tiếp tín hiệu đúng cách, kém tin cậy cho môi trường sản xuất.

Tôi có thể ghi đè ENTRYPOINT lúc chạy mà không đổi Dockerfile không?

Có, bạn có thể ghi đè ENTRYPOINT lúc chạy bằng cờ --entrypoint với docker run. Điều này hữu ích cho gỡ lỗi hoặc tạm thời chạy lệnh thay thế.

Vì sao một số container không dừng đúng cách khi dùng ENTRYPOINT?

Điều này thường xảy ra khi dùng dạng shell của ENTRYPOINT, vốn ngăn việc chuyển tiếp tín hiệu đúng đến tiến trình chính do có shell trung gian. Hãy dùng dạng exec để tránh vấn đề này.

Có phải là không tốt nếu đưa quá nhiều logic vào script ENTRYPOINT?

Có. Giữ script ENTRYPOINT ở mức tối thiểu là thực tiễn tốt. Hãy chuyển logic phức tạp sang các script hoặc tiện ích khởi tạo riêng. Điều này cải thiện khả năng bảo trì và giảm khó khăn khi gỡ lỗi.

Chủ đề

Liên quan