Sunday, September 29, 2024

[Docker] Phần 15 – Sự khác nhau giữa RUN, CMD, ENTRYPOINT trong Dockerfile

-

Khái niệm

RUN, CMD và ENTRYPOINT là các chỉ thị được sử dụng trong Dockerfile để cấu hình và xây dựng một image Docker.

  • RUN là chỉ thị để thực thi các lệnh trong quá trình xây dựng image. Các lệnh này có thể bao gồm việc cài đặt các gói phần mềm, tạo các thư mục, tải xuống các file, và các tác vụ khác cần thiết để xây dựng image. Mỗi lệnh được thực thi trong một layer của image và được lưu trữ trong bộ nhớ cache của Docker. Khi sử dụng các lệnh RUN để cài đặt các gói phần mềm, chúng ta nên kết hợp các lệnh lại với nhau để giảm kích thước của image.
  • CMD là chỉ thị để chỉ định lệnh mặc định sẽ được thực thi khi container được khởi chạy từ image. Chỉ thị này có thể được định nghĩa ở nhiều vị trí trong Dockerfile, nhưng chỉ có một chỉ thị CMD cuối cùng sẽ được sử dụng. Chỉ thị CMD thường được sử dụng để thiết lập lệnh thực thi chính của ứng dụng khi container được khởi chạy, ví dụ như “python app.py” cho ứng dụng Python.
  • ENTRYPOINT là chỉ thị tương tự như CMD, nhưng nó cho phép thêm đối số vào lệnh thực thi khi container được khởi chạy. Chỉ thị ENTRYPOINT có thể được định nghĩa ở nhiều vị trí trong Dockerfile, tuy nhiên chỉ có một chỉ thị ENTRYPOINT cuối cùng sẽ được sử dụng. Chỉ thị này thường được sử dụng để định nghĩa lệnh thực thi chính của ứng dụng và cho phép người dùng thêm các đối số khác nhau khi chạy container. Ví dụ, “python” có thể được định nghĩa là lệnh thực thi chính của ứng dụng và các đối số như “app.py” có thể được thêm vào khi container được khởi chạy.

Sự khác nhau giữa RUN, CMD, ENTRYPOINT trong Dockerfile

Tuy nhiên, chúng có mục đích và cách sử dụng khác nhau như sau:

  • RUN: Chỉ thị RUN được sử dụng để thực thi một lệnh trong quá trình xây dựng image. Ví dụ, để cài đặt các gói phần mềm cần thiết, chúng ta có thể sử dụng chỉ thị RUN để chạy lệnh apt-get install hoặc yum install, tùy thuộc vào hệ điều hành sử dụng. Các chỉ thị RUN sẽ tạo ra các lớp (layer) mới trong image.
  • CMD: Chỉ thị CMD được sử dụng để chỉ định lệnh mặc định sẽ được thực thi khi container được khởi chạy từ image. Chỉ thị này có thể được định nghĩa ở nhiều vị trí trong Dockerfile, nhưng chỉ có một chỉ thị CMD cuối cùng sẽ được sử dụng. Ví dụ, để thiết lập lệnh mặc định là “python app.py” khi container được khởi chạy, ta có thể sử dụng chỉ thị CMD như sau: CMD [“python”, “app.py”]
  • ENTRYPOINT: Chỉ thị ENTRYPOINT cũng được sử dụng để chỉ định lệnh mặc định sẽ được thực thi khi container được khởi chạy từ image. Tuy nhiên, ENTRYPOINT cung cấp khả năng cho phép chèn thêm các đối số (arguments) vào lệnh thực thi này khi chạy container. Chỉ thị ENTRYPOINT có thể được định nghĩa ở nhiều vị trí trong Dockerfile, tuy nhiên chỉ có một chỉ thị ENTRYPOINT cuối cùng sẽ được sử dụng. Ví dụ, để thiết lập lệnh mặc định là “python” và cho phép thêm các đối số vào lệnh này khi container được khởi chạy, ta có thể sử dụng chỉ thị ENTRYPOINT như sau: ENTRYPOINT [“python”].

Như vậy, RUN được sử dụng để thực thi các lệnh trong quá trình xây dựng image, CMD và ENTRYPOINT được sử dụng để chỉ định lệnh mặc định khi container được khởi chạy. Tuy nhiên, CMD chỉ định lệnh mặc định cố định trong khi ENTRYPOINT cho phép chèn thêm đối số vào lệnh mặc định này khi container được khởi chạy.

Ví dụ về RUN, CMD, ENTRYPOINT trong Dockerfile

Dưới đây là một ví dụ về cách sử dụng RUN, CMD và ENTRYPOINT trong Dockerfile:

FROM python:3.9-slim

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

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

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

Trong ví dụ này:

  • Chúng ta sử dụng image python:3.9-slim làm cơ sở để xây dựng image của chúng ta.
  • Sử dụng chỉ thị RUN để cài đặt các gói phần mềm cần thiết (git, curl) và cài đặt các thư viện Python thông qua lệnh pip.
  • Thiết lập thư mục làm việc bằng chỉ thị WORKDIR.
  • COPY tệp tin requirements.txt vào thư mục hiện tại, và cài đặt các gói phần mềm cần thiết thông qua lệnh pip.
  • COPY các file của ứng dụng vào thư mục hiện tại.
  • Sử dụng chỉ thị CMD để thiết lập lệnh mặc định cho container khi khởi chạy, trong trường hợp này là “python app.py”.

Ngoài ra, chúng ta cũng có thể sử dụng chỉ thị ENTRYPOINT để định nghĩa lệnh thực thi chính và cho phép thêm các đối số vào khi container được khởi chạy, ví dụ như sau:

FROM python:3.9-slim

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

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

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

Trong ví dụ này, chúng ta sử dụng chỉ thị ENTRYPOINT để thiết lập lệnh thực thi chính cho ứng dụng và các đối số có thể được thêm vào khi container được khởi chạy. Điều này có nghĩa là khi chúng ta khởi động container từ image này, lệnh thực thi sẽ là “python app.py”, và các đối số khác nhau có thể được thêm vào cuối lệnh thực thi. Ví dụ: docker run myapp arg1 arg2 sẽ thực thi lệnh “python app.py arg1 arg2”.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories