Xem lệnh đầy đủ của container đang chạy / dừng trong Docker


263

Làm cách nào tôi có thể thấy lệnh đầy đủ của một container / tiến trình đang chạy trong Docker?

$ docker ps --all
CONTAINER ID    IMAGE          COMMAND                 CREATED          STATUS                     PORTS    NAMES
5b6291859b61    nginx:1.7.8    "nginx -g 'daemon of    4 minutes ago    Exited (0) 4 minutes ago            thirsty_brattain

Tôi chỉ có thể thấy "nginx -g 'daemon của" .. ở đây, không phải là lệnh đầy đủ.


2

Câu trả lời:


544

docker ps --no-trunc sẽ hiển thị lệnh đầy đủ cùng với các chi tiết khác của các container đang chạy.


13
Cảm ơn điều này đã giúp rất nhiều. Chỉ cần một lưu ý: '-notrunc' không được dùng nữa, được thay thế bằng --no-trunc.
Prometheus

2
Điều này đã không làm việc cho tôi. Nó đưa cho tôi lệnh nhưng không phải tất cả các công tắc (đó là những gì tôi nghĩ khi sử dụng "lệnh đầy đủ"). Lệnh runlike đề cập đến liên kết khác ở trên làm việc tốt hơn đối với tôi.
Dylan Smith

1
Đối với lệnh đầy đủ chỉ chạy container, chỉ cần loại bỏ tất cả lệnh. docker ps --no-trunc
Jacob Morris

Cảm ơn - đã sửa. Lệnh trước đây của tôi là dành cho tất cả các container và không chỉ chạy container mà là câu hỏi ban đầu.
Scott S.

Lệnh không được cắt có thể rất dài, chỉ nhìn thấy 400 ký tự đầu tiên mỗi dòng vớidocker ps --all --no-trunc|cut -c-400
rubo77

183

Sử dụng:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)

... nó thực hiện "kiểm tra docker" cho tất cả các container.


8
Điều này không hiển thị lệnh ps docker. Lệnh ps docker tương ứng với docker kiểm tra Path và Args.
JDiMatteo

3
Không có bueno kể từ tháng 1 năm 2018
sg

4
tức làdocker inspect -f "{{.Name}} {{.Path}} {{.Args}}" $(docker ps -a -q)
Paul

2
Nếu bạn chỉ ném ra sudotrước lệnh, bạn sẽ nhận được "docker inspect" requires at least 1 argument(s).vì cuộc gọi thứ hai để nhận tất cả các tên của container, có lẽ bạn sẽ muốn thêm một sudo ngay bên trong $(.
RandomInsano

và đối với những người muốn hiểu rõ hơn về truy vấn -f, tôi đã tìm thấy một lời giải thích tốt ở đây container-solutions.com/docker-inspect-template-magic
intijk

16

Sử dụng:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)

Điều đó sẽ hiển thị đường dẫn lệnh và đối số, tương tự như docker ps.


Làm thế nào bạn sẽ sửa đổi điều này để tìm kiếm một lệnh cụ thể như kube-apiserver?
Jonathan

@ Jonathandocker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q) | grep kube-apiserver
rrw

8

Sử dụng runlike từ kho git https://github.com/lavie/runlike

Để cài đặt runlike

pip install runlike

Vì nó chấp nhận id container làm đối số nên để trích xuất id container sử dụng lệnh sau

docker ps -a -q

Bạn nên sử dụng runlike để trích xuất lệnh chạy docker hoàn chỉnh với lệnh sau

runlike <docker container ID>

Không hoạt động. Hiển thị "Lệnh '[' docker ',' Kiểm tra ', u'06e6a369f909'] 'trả về trạng thái thoát không khác 1"
fstang

Bạn đã cài đặt runlike như tôi đã đề cập
Abhishek Jain

5
Thậm chí tốt hơn bạn có thể chạy runlike trong một container docker và tránh cài đặt nó:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Dylan Smith

3

TL-DR

docker ps --no-truncdocker 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 psdocker 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}}"'

2

Chuyển bình luận của Dylan thành một câu trả lời đầy đủ vì TUYỆT VỜI:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

Nó làm gì? Chạy https://github.com/lavie/runlike bên trong một container, giúp bạn có lệnh chạy docker hoàn chỉnh, sau đó xóa container cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.