TL-DR
docker ps --no-truncvà docker inspect CONTAINERcung 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 CONTAINERcó 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.Envtính.
docker psvà docker inspectcung 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 pshoặc /proc/1/cmdlinegiú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ư $FOOhoặ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 --formatcờ docker inspectcho 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 1bởi vì quá trình được thực hiện bởi điểm nhập thường là quy trình có 1id.
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 -PIDtrong đó 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-trunckhô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}}"'