如何在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'守护进程,而不是完整的命令。
答案 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-trunc
和docker inspect CONTAINER
沿传递给命令的命令提供了启动容器所执行的入口点,但是可能会漏掉某些部分,例如${ANY_VAR}
,因为容器环境变量未打印为解决。
要克服这一点,docker inspect CONTAINER
有一个优势,因为它还允许从Config.Env
属性中分别检索容器中定义的env变量及其值。
docker ps
和docker 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