Hỏi về docker basic

Hi.

Mình vô tính thấy 2 đoạn lện này, nhưng chưa phân biệt được rõ ràng. Mọi người chỉ giúp mình với

	docker run -it python:3.9 
	docker run -it --entrypoint:bash python:3.9

Theo mình hiểu lệnh thứ nhất, tạo một container từ image python, tag 3.9. sau đó, có một cái bash để chạy code python

Lệnh thứ 2, thì hơi khác một chút, kết quả của nó giống như kiểu mình tạo một container ubuntu (cái này mình đoán vì khi connect vào nó mình ls ra thì thấy danh sách các thư mục khá giống với ubuntu, nhưng thiếu một vài folder), ở đó cài đặt sãn python 3.9, mình có thể chạy python trên đó và cài đặt nhiều thứ khác. Có phải là nó tạo ra một container mới với các thư việc mình mới cài thêm không, sau đó có thể thuận tiện cho mình đóng gói.

Vậy câu hỏi của mình là, 2 lệnh trên thực sự là gì, khi nào thì dùng chúng?

Cám ơn mọi người

Lệnh 2 giống lệnh 1 mà, đều chạy container từ image python:3.9 thôi. Khác nhau là từ khóa entrypoint, là lệnh đầu tiên thực hiện khi container startup. Default entrypoint là /bin/sh -c

3 Likes

về cửa sổ dòng lệnh thì mình khá mô hồ về định nghĩa của chúng. Mong bạn giải đáp thêm.

Ví dụ: khi mình cài ubuntu trên một máy vật lý, mình có thể thao tác lệnh bằng cách mở terminal lên hoặc nếu quên pass thì mình có thể dùng cái tty để thao tác).

Ở đây bạn có dùng thêm cái khái niệm entrypoint mà giá trị của nó là /bin/sh -c, mình chưa thật sự hiểu rõ nó lắm, mặc dù thực tế mình thấy tất cả nó đều chỉ là terminal thôi.

vậy nó cũng nhưng loại nào và hình thức có nó có giống nhau hết không?

Quay trở lại ví dụ, mình nêu, nếu khác nhau như vậy, thì mục đích là để làm gì, đại ý là khi mình có thêm từ khoá đấy, mình có thể làm thêm những thừ gì mà không có nó thì không làm được (cụ thể là về giá trị entrypoint có thể nhận).

1 Like

Xin lỗi bạn, có lẽ mình nhầm do code của bạn.
Cái mình nói về entrypoint là flag --entrypoint của docker. Còn cái entrypoint:bash có thể hiểu là 1 cái docker image tên là entrypoint có tag version là bash. Mình thực sự không biết ai viết script troll như vậy. Có thể đúng như bạn nói thì cái image entrypoint này là ubuntu base. Nhưng mình cực kỳ không khuyến khích bạn học theo người ta dùng cái tên docker image hại người như vậy. Có thể rename lại là ubuntu:v1.1.

Nói về flag --entrypoint, --entrypoint quy định command đầu tiên chạy khi container startup. Ví dụ giá trị default của entrypoint là /bin/sh -c , nghĩa là nếu bạn mở docker lên và gõ lệnh ps -au bạn sẽ thấy process có PID 1 là /bin/sh -c . Đây là được xem là init process trong Unix, không thể bị kill bởi SIGKILL hay SIGTERM.
Thông thường người ta sẽ chạy lệnh:

docker run -it python:3.9 /bin/bash

Để nó tạo một interactive bash trong container, như vậy bash này sẽ là PID 1 và bạn có thể thao tác các lệnh khác.
Giả sử bạn đang code 1 script init 1 backend server, và start nhiều docker mà không cần phải interactive với container, thì bạn bỏ -it đi, và lúc đó bạn cần cái container đó chạy 1 tác vụ nào đó, thì bạn chạy:

docker run python:3.9 mybackend.sh

như vậy script mybackend.sh sẽ được thực thi thay vì là bash như nói ở trên.
Vậy entrypoint để làm gì?
Ví dụ mình tạo 1 con bot discord bằng python, container của mình chỉ quan tâm tới code của con bot, vậy mình sẽ viết:

docker run --entrypoint python python:3.9 bot.py

như vậy container sẽ chạy python bot.py

7 Likes

cám ơn bạn, hôm nay mình mới quay lại đọc tiếp về docker. Đúng ra nó là
–entrypoint đấy, mà không hiểu kiểu gi mình gõ nhầm.

Khi bạn viết dòng này, thì mình đưa nó về dòng này trong Dockerfile, vì theo mình hiểu nó có tác dụng khá giống với những gì bạn nói.

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

Vậy cái để chứa mà cho python nó chạy được thì gọi là gì vậy bạn, hay là mặc định, python:3.9 image luôn chưa một cái gì để để nó có thể chạy được. Mình cảm giác cái điều mình nghĩ không đúng lắm, vì mình có lên docker hub, xem các layer của nó, mình chưa thấy một cái gì hiện diễn như kiểu (ví dụ, cài ubuntu, xong cái python, thì ubuntu giúp mình chạy python), vậy cái giúp chạy python nó ở đâu.

Khi bạn đề cập tới Dockerfile thì mình nghĩ là bạn nên tìm hiểu từng dòng trong Dockerfile có tác dụng gì. Ở đây chúng ta quan tâm tới từ khóa FROM:


FROM define image docker có thể build up từ ubuntu hoặc 1 nhân linux nào đó, ví dụ debian.

Quay trở lại python:3.9 , thì python là tên của base image. Trong Dockerfile của bạn sẽ có dòng này:

FROM python:3.9

Cụ thể thì theo https://hub.docker.com/_/python , tag 3.9 map tới 3.9.14-bullseye , đây là bulleye debian os.

minh hiểu cái từ khóa FROM trong dockerfile mà bạn nói, còn base image là nó là python3.9 đâu phải 3.9.14-bullseye đâu. Giả sử có mối liên hệ nào giữa các base image này thì mình chưa xét, mình chỉ đang quan tâm cái base image mình khai báo trong dockerfile thôi, nó là python3.9 không phải là map tới cái bản bạn nói, mình thì không thấy đoạn map đó.

còn về thông tin bạn bạn có nói thêm thì mình tìm thấy os của nó rồi, chính là dòng đoạn này

Map hay không map nó chỉ là tag thôi. Bạn kéo xuống dưới trên trang chính là thấy có đoạn nhắc về shared tag

Đây là kết quả khi chạy lệnh cat /etc/*release của image python:3.9

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Dockerfile của mình:

# syntax=docker/dockerfile:1
FROM python:3.9
WORKDIR /app
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?