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


262

如何查看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'daemon of”,而不是完整命令。


Answers:


543

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


13
谢谢,这帮了很多忙。仅需注意:不推荐使用-notrunc,而由代替--no-trunc
Prometheus 2015年

2
这对我不起作用。它给了我命令,但没有提供所有开关(这是我在使用“完整命令”时所想到的)。上面其他链接提到的runlike命令对我来说效果更好。
迪伦·史密斯

1
对于仅运行容器的完整命令,只需删除all命令。docker ps --no-trunc
雅各布·莫里斯

谢谢-已更正。我以前的命令适用于所有容器,而不仅仅是运行容器,这是最初的问题。
Scott S.

不可截断的命令可能很长,每行仅显示前400个字符,以及docker ps --all --no-trunc|cut -c-400
rubo77

183

用:

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

...它对所有容器进行“码头工人检查”。


8
这不会显示docker ps命令。docker ps命令对应于docker inspect Path和Args。
JDiMatteo

3
截至2018
sg

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

2
如果您只是将sudo命令放在前面,则会"docker inspect" requires at least 1 argument(s).因为第二次调用而获得所有容器名称,因此可能需要在内添加一个sudo $(
RandomInsano

对于那些想更好地了解-f查询的人,我在这里找到了一个很好的解释container-solutions.com/docker-inspect-template-magic
intijk

16

用:

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

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


您将如何修改它以搜索诸如的特定命令kube-apiserver
乔纳森

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

8

从git仓库https://github.com/lavie/runlike使用runlike

要安装runlike

pip install runlike

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

docker ps -a -q

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

runlike <docker container ID>

不起作用 显示“命令'['docker','inspect',u'06e6a369f909']'返回的非零退出状态1”
fstang

如我所述,您是否安装了runlike
Abhishek Jain

5
甚至更好的是,您可以在docker容器中运行类似并且避免安装它: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 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

它打印:

容器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

当我们检查阿尔卑斯示例容器时:

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标志,该标志docker inspect允许指定JSON属性进行渲染:

docker inspect --format '{{.Name}} {{.Config.Cmd}}  {{ (.Config.Env) }}'  alpine-example

输出:

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

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

泊坞窗执行的入口点和命令可能会有所帮助,但在某些情况下,这还不够,因为这仅仅.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

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

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

docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo    

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

ps -$(docker container inspect --format '{{.State.Pid}}'  CONTAINER)

使用docker ps的用户友好格式

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

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

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

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

2

将Dylan的评论转为完整的答案,因为太有用了:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.