TL-DR
docker ps --no-trunc
và docker inspect CONTAINER
cung cấp điểm nhập được thực thi để khởi động container, dọc theo lệnh được truyền tới, nhưng điều đó có thể bỏ lỡ một số phần như ${ANY_VAR}
vì các biến môi trường của container không được in như đã giải quyết.
Để khắc phục điều đó, docker inspect CONTAINER
có một lợi thế bởi vì nó cũng cho phép truy xuất các biến env riêng và các giá trị của chúng được xác định trong vùng chứa từ thuộc Config.Env
tính.
docker ps
và docker inspect
cung cấp thông tin về điểm vào được thực hiện và lệnh của nó. Thông thường, đó là một tập lệnh nhập điểm bao bọc ( .sh
) và không phải là chương trình "thực" được bắt đầu bởi vùng chứa. Để có được thông tin về điều đó, yêu cầu xử lý thông tin với ps
hoặc /proc/1/cmdline
giúp đỡ.
1) docker ps --no-trunc
Nó in điểm vào và lệnh được thực thi cho tất cả các container đang chạy. Trong khi nó in lệnh được chuyển đến điểm vào (nếu chúng ta vượt qua điều đó), nó không hiển thị giá trị của các biến env của docker (chẳng hạn như $FOO
hoặc ${FOO}
).
Nếu các container của chúng tôi sử dụng các biến env, nó có thể không đủ.
Ví dụ: chạy một thùng chứa trên núi cao:
docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
Khi sử dụng docker -ps như:
docker ps -a --filter name = alpine-example --no-trunc
Nó in:
CONTAINER ID HÌNH ẢNH TÌNH TRẠNG TÌNH TRẠNG TẠO TÊN
5b064a6de6d8417 ... alpine: mới nhất "sh -c 'ls $ MY_VAR'" 2 phút trước Đã thoát (0) 2 phút trước ví dụ về alpine
Chúng tôi thấy lệnh được chuyển đến điểm vào: sh -c 'ls $MY_VAR'
nhưng $MY_VAR
thực sự không được giải quyết.
2) docker inspect CONTAINER
Khi chúng tôi kiểm tra thùng chứa ví dụ núi cao:
docker inspect alpine-example | grep -4 Cmd
Lệnh cũng ở đó nhưng chúng ta vẫn không thấy giá trị biến env:
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
],
Trong thực tế, chúng ta không thể thấy các biến nội suy với các lệnh docker này.
Trong khi đánh đổi, chúng ta có thể hiển thị riêng cả hai biến lệnh và env cho một container với docker kiểm tra:
docker inspect alpine-example | grep -4 -E "Cmd|Env"
Đó là bản in:
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
Một cách khác của docker sẽ là sử dụng --format
cờ docker inspect
cho phép chỉ định các thuộc tính JSON để kết xuất:
docker inspect --format '{{.Name}} {{.Config.Cmd}} {{ (.Config.Env) }}' alpine-example
Đó là đầu ra:
/ alpine-example [sh -c ls $ MY_VAR] [MY_VAR = / var PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin]
3) Lấy quy trình bắt đầu từ chính container để chạy container
Điểm truy cập và lệnh được thực thi bởi docker có thể hữu ích nhưng trong một số trường hợp, điều đó là không đủ vì đó là "chỉ" một tập lệnh nhập điểm bao bọc ( .sh
) chịu trách nhiệm bắt đầu quá trình thực / lõi.
Ví dụ: khi tôi chạy bộ chứa Nexus, lệnh được thực thi và hiển thị để chạy bộ chứa đó "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"
.
Đối với PostgreSQL đó là "docker-entrypoint.sh postgres"
.
Để có thêm thông tin, chúng tôi có thể thực thi trên một container đang chạy
docker exec CONTAINER ps aux
.
Nó có thể in các quy trình khác có thể không quan tâm đến chúng tôi.
Để thu hẹp quy trình ban đầu được khởi chạy bởi điểm vào, chúng ta có thể làm:
docker exec CONTAINER ps -1
Tôi xác định 1
bởi vì quá trình được thực hiện bởi điểm nhập thường là quy trình có 1
id.
Không có ps
, chúng ta vẫn có thể tìm thấy thông tin trong /proc/1/cmdline
(trong hầu hết các bản phân phối Linux nhưng không phải tất cả). Ví dụ :
docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo
Nếu chúng ta có quyền truy cập vào máy chủ docker đã khởi động container, một cách khác để nhận toàn bộ lệnh của quá trình được thực thi bởi entrypoint là :: thực thi ps -PID
trong đó PID là tiến trình cục bộ được tạo bởi daemon Docker để chạy container như:
ps -$(docker container inspect --format '{{.State.Pid}}' CONTAINER)
Định dạng thân thiện với người dùng với docker ps
docker ps --no-trunc
không phải lúc nào cũng dễ đọc.
Chỉ định các cột để in và ở định dạng bảng có thể làm cho nó tốt hơn:
docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"
Tạo một bí danh có thể giúp:
alias dps='docker ps --no-trunc --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'