---
# System prepended metadata

title: Different btw CMD vs Entrypoint vs RUN in Docker
tags: [docker, research, tutorials]

---

# Different btw CMD vs Entrypoint vs RUN in Docker
###### tags: `research` `tutorials` `docker`

# Tiếng việt

**Sự khác biệt giữa RUN, CMD và ENTRYPOINT trong Dockerfile**
- RUN thực thi các lệnh command line và một layer mới. Ví dụ: thường được sử dụng để cài đặt các gói phần mềm.
- CMD thực hiện lệnh mặc định khi chúng ta khởi tạo container từ image, lệnh mặc định này có thể được ghi đè từ dòng lệnh khi khởi tại container.
- ENTRYPOINT khá giống CMD đều dùng để chạy khi khởi tạo container, nhưng ENTRYPOINT không thể ghi đè từ dòng lệnh khi khi khởi tạo container.

**Shell form**

Thường được sử dụng nhiều với RUN --> chủ yếu đề cái package và các command trong image
Command-construct: `<instruction> <command>`

**Exec form**

Exec form được sử dụng nhiều hơn với CMD và ENTRYPOINT
Command-construct: `<instruction> ["executable", "param1", "param2", ...]`

CMD có 3 dạng form:
```
- CMD ["executable", "param1", "param2"]   (exec form)
- CMD ["param1", "param2"]  (đặt các tham số mặc định cho ENTRYPOINT ở dạng exec form)
- CMD command param1 param2   (shell form)
```
*Cách thứ 2 được sử dụng cùng với ENTRYPOINT trong exec form. Nó set default parameters được thêm vào ENTRYPOINT nếu container chạy mà không truyền đối số nào, ngược lại nó sẽ bị ignore*

==> `docker run -it <tên_image>` --> sẽ cho ra kết quả || ngược lại khi có `docker run -it <tên_image> /bin/bash`, CMD sẽ bị ignored và bash sẽ được thay thế 

ENTRYPOINT có 2 dạng form:
```
- ENTRYPOINT ["executable", "param1", "param2"] (exec form)
- ENTRYPOINT command param1 param2 (shell form)
```
Ví dụ ta có dockerfile 
```
FROM ubuntu:latest
ENTRYPOINT ["/bin/echo", "Xin chào"]
CMD ["các bạn"]
```
==> `docker run -it <tên_image>`, kết quả sẽ là 🥥 
Xin chào các bạn

==> `docker run -it <tên_image>` Nguyễn Văn A 💯 
Xin chào Nguyễn Văn A

Reference: [Khác biệt giữa CMD vs ENTRYPOINT vs RUN](https://techmaster.vn/posts/36513/su-khac-biet-giua-run-cmd-va-entrypoint-trong-dockerfile)

# English

**Difference between RUN, CMD and ENTRYPOINT in Dockerfile**
- RUN executes command line commands and a new layer. For example, commonly used to install software packages.
- CMD executes default command when we initialize container from image, this default command can be overridden from command line when initializing container.
- ENTRYPOINT is quite similar to CMD which is used to run when initializing the container, but ENTRYPOINT cannot be overwritten from the command line when initializing the container.

**Shell form**

Usually used a lot with RUN -> mainly about the package and the commands in the image
Command-construct: `<instruction> <command>`

**Exec form**

Exec form is more used with CMD and ENTRYPOINT
Command-construct: `<instruction> ["executable", "param1", "param2", ...]`

CMD has 3 forms:
```
- CMD ["executable", "param1", "param2"] (exec form)
- CMD ["param1", "param2"] (set default parameters for ENTRYPOINT in exec form)
- CMD command param1 param2 (shell form)
```
*The second method is used together with ENTRYPOINT in exec form. It sets default parameters to be added to ENTRYPOINT if the container runs without passing any arguments, otherwise it will be ignored*

==> `docker run -it <name_image>` --> will output || otherwise when there is `docker run -it <name_image> /bin/bash`, CMD will be ignored and bash will be replaced

ENTRYPOINT has 2 forms:
```
- ENTRYPOINT ["executable", "param1", "param2"] (exec form)
- ENTRYPOINT command param1 param2 (shell form)
```
For example we have dockerfile
```
FROM ubuntu:latest
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["you"]
```
==> `docker run -it <name_image>`, the result will be
Hello you

==> `docker run -it <name_image>` Nguyen Van A
Hello Nguyen Van A

Reference: [Difference between CMD vs ENTRYPOINT vs RUN](https://techmaster.vn/posts/36513/su-khac-biet-giua-run-cmd-va-entrypoint-in-dockerfile)