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

Nik*_*as9 223 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
Run Code Online (Sandbox Code Playgroud)

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

ssc*_*oss 453

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

  • 问题是:"你怎么看到正在运行的容器的完整命令?" 我列出的命令就是这么做的.需要的是-notrunc选项.请解释我的答案如何回答这个问题. (17认同)
  • 谢谢这帮了很多忙.请注意:'-notrunc'已被弃用,取而代之的是``--no-trunc``. (12认同)
  • 为了更方便地阅读,可以将命令通过管道传输到“less”,如下所示:“docker ps --no-trunc | 少-S`。这会删除换行符并允许您水平滚动。 (3认同)
  • 这对我不起作用。它给了我命令,但不是所有开关(这是我在使用“完整命令”时想到的)。上面提到的其他链接的 runlike 命令对我来说效果更好。 (2认同)

st0*_*0ne 179

使用:

docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)
Run Code Online (Sandbox Code Playgroud)

......对所有集装箱进行"码头检查".

  • `docker ps -a --no-trunc`将提供完整的命令 (90认同)
  • 这不显示docker ps命令.docker ps命令对应docker检查Path和Args. (8认同)
  • 截至2018年1月没有布宜诺斯艾利斯 (3认同)
  • 即`docker inspect -f“ {{.Name}} {{.Path}} {{.Args}}” $(docker ps -a -q)` (2认同)
  • 如果只是在命令前抛出sudo,则将得到“ docker inspect”至少需要1个参数。由于第二次调用以获得所有容器名称,您将可能想在`$(`内添加一个sudo。 (2认同)

Abh*_*ain 15

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

安装 runlike

pip install runlike
Run Code Online (Sandbox Code Playgroud)

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

docker ps -a -q
Run Code Online (Sandbox Code Playgroud)

您可以使用 runlike 使用以下命令提取完整的 docker run 命令

runlike <docker container ID>
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,您可以在 docker 容器中运行 runlike 并避免安装它: ```docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER`` ` (10认同)

JDi*_*teo 14

使用:

docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)
Run Code Online (Sandbox Code Playgroud)

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


Gun*_*ner 12

将 Dylan 的评论变成一个完整的答案,因为太有用了:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
Run Code Online (Sandbox Code Playgroud)

它有什么作用?在容器内运行https://github.com/lavie/runlike,获取完整的 docker run 命令,然后为您移除容器。


dav*_*xxx 9

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 变量(例如$FOOor ${FOO})的值。
如果我们的容器使用 env 变量,可能还不够。

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

docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
Run Code Online (Sandbox Code Playgroud)

当使用 docker -ps 如:

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

它打印:

容器 ID 图像命令创建状态端口名称
5b064a6de6d8417... alpine:latest "sh -c 'ls $MY_VAR'" 2 分钟前退出 (0) 2 分钟前 alpine-example

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

2) docker inspect CONTAINER

当我们检查 alpine-example 容器时:

docker inspect alpine-example | grep -4 Cmd
Run Code Online (Sandbox Code Playgroud)

该命令也在那里,但我们仍然看不到 env 变量值:

        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ],
Run Code Online (Sandbox Code Playgroud)

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

docker inspect  alpine-example  | grep -4 -E "Cmd|Env"
Run Code Online (Sandbox Code Playgroud)

那打印:

        "Env": [
            "MY_VAR=/var",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "Cmd": [
            "sh",
            "-c",
            "ls $MY_VAR"
        ]
Run Code Online (Sandbox Code Playgroud)

更 docker 的方式是使用允许指定要渲染的 JSON 属性的--format标志docker inspect

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example
Run Code Online (Sandbox Code Playgroud)

输出:

/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 执行的入口点和命令可能会有所帮助,但在某些情况下,这还不够,因为这“只是”一个.sh负责启动真实/核心进程的包装入口点脚本 ( )。
例如,当我运行 Nexus 容器时,执行并显示运行容器的命令是"sh -c ${SONATYPE_DIR}/start-nexus-repository-manager.sh".
对于 PostgreSQL,即"docker-entrypoint.sh postgres".

要获取更多信息,我们可以在正在运行的容器上执行 docker exec CONTAINER ps aux
它可能会打印我们可能不感兴趣的其他流程。
为了缩小到入口点启动的初始进程,我们可以这样做:

docker exec CONTAINER ps -1
Run Code Online (Sandbox Code Playgroud)

我指定1是因为入口点执行的进程通常是带有1id的进程。

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

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    
Run Code Online (Sandbox Code Playgroud)

如果我们可以访问启动容器的 docker 主机,获取入口点执行的进程的完整命令的另一种替代方法是 :: executeps -PID其中 PID 是由 Docker 守护进程创建的本地进程来运行容器,例如:

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)
Run Code Online (Sandbox Code Playgroud)

使用 docker ps 进行用户友好的格式化

docker ps --no-trunc并不总是容易阅读。
以表格格式指定要打印的列可能会更好:

docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"
Run Code Online (Sandbox Code Playgroud)

创建别名可能有帮助:

alias dps='docker ps   --no-trunc  --format "table{{.Names}}\t{{.CreatedAt}}\t{{.Command}}"'
Run Code Online (Sandbox Code Playgroud)