查看Docker中运行/停止容器的完整命令

时间:2014-12-09 13:55:10

标签: docker

如何在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

我只能在这里看到" nginx -g'守护进程,而不是完整的命令。

6 个答案:

答案 0 :(得分:383)

docker ps -a --no-trunc将显示完整命令以及正在运行的容器的其他详细信息。

答案 1 :(得分:161)

使用:

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

...它为所有容器进行“码头检查”。

答案 2 :(得分:13)

使用:

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

这将显示命令路径和参数,类似于docker ps

答案 3 :(得分:8)

由于太有用了,所以将Dylan的评论移至完整的答案:

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

它是做什么的?在容器中运行https://github.com/lavie/runlike,获取完整的docker run命令,然后为您删除容器。

答案 4 :(得分:6)

TL-DR

docker ps --no-truncdocker inspect CONTAINER沿传递给命令的命令提供了启动容器所执行的入口点,但是可能会漏掉某些部分,例如${ANY_VAR},因为容器环境变量未打印为解决。

要克服这一点,docker inspect CONTAINER有一个优势,因为它还允许从Config.Env属性中分别检索容器中定义的env变量及其值。

docker psdocker inspect提供有关已执行入口点及其命令的信息。通常,这是包装程序入口点脚本(.sh),而不是容器启动的“实际”程序。要获取有关此信息,请在ps/proc/1/cmdline帮助下请求过程信息。


1)docker ps --no-trunc

它将打印所有正在运行的容器的入口点和执行的命令。 在打印传递到入口点的命令(如果我们通过该命令)时,它不会显示docker env变量(例如$FOO${FOO})的值。
如果我们的容器使用env变量,可能还不够。

例如,运行一个高山容器:

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'

使用docker -ps时,例如:

docker ps -a --filter name = alpine-example --no-trunc

它打印:

CONTAINER ID           IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
5b064a6de6d8417...   alpine:latest       "sh -c 'ls $MY_VAR'"   2 minutes ago       Exited (0) 2 minutes ago                       alpine-example

我们看到传递给入口点的命令:sh -c 'ls $MY_VAR',但是$MY_VAR确实没有解决。

2)docker inspect CONTAINER

当我们检查高山示例容器时:

docker inspect alpine-example | grep -4 Cmd

命令也存在,但是我们仍然看不到env变量值:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],

实际上,我们无法使用这些docker命令看到插值变量。
作为权衡,我们可以使用docker inspect分别显示容器的命令和环境变量:

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"

显示:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]

另一种docker方法是使用--format的{​​{1}}标志,该标志允许指定JSON属性进行渲染:

docker inspect

输出:

/alpine-example [sh -c ls $MY_VAR]  [MY_VAR=/var PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

3)从容器本身检索启动的进程以运行容器

由docker执行的入口点和命令可能会有所帮助,但是在某些情况下,这还不够,因为这仅仅是负责启动真实/核心进程的包装入口点脚本(docker inspect --format '{{.Name}} {{.Config.Cmd}} {{ (.Config.Env) }}' alpine-example )。
例如,当我运行Nexus容器时,执行并显示为运行容器的命令为.sh
对于PostgreSQL "sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh"

要获取更多信息,我们可以在运行中的容器上执行 "docker-entrypoint.sh postgres"
它可能会打印出其他我们可能不感兴趣的过程。
为了缩小入口点启动的初始过程,我们可以这样做:

docker exec CONTAINER ps aux

我之所以指定docker exec CONTAINER ps -1 是因为入口点执行的进程通常是ID为1的进程。

没有1,我们仍然可以在ps中找到信息(在大多数Linux发行版中,但不是全部)。例如:

/proc/1/cmdline

如果我们可以访问启动容器的docker主机,则获取入口点执行的进程的完整命令的另一种方法是: :执行docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo ,其中PID是Docker守护进程创建的用于运行容器的本地进程,例如:

ps -PID

使用docker ps的用户友好格式

ps -$(docker container inspect --format '{{.State.Pid}}' CONTAINER) 并不总是很容易阅读。
以表格格式指定要打印的列可能会更好:

docker ps --no-trunc

创建别名可能会有所帮助:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"

答案 5 :(得分:3)

使用git存储库 https://github.com/lavie/runlike

中的 runlike

要安装runlike

html

因为它接受容器ID作为参数,所以要使用以下命令提取容器ID

pip install runlike

您很好使用runlike通过以下命令提取完整的docker run命令

docker ps -a -q