请参阅Docker中运行/停止容器的完整命令
如何在Docker中查看正在运行的容器/进程的完整命令请参阅Docker中运行/停止容器的完整命令,docker,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 minut
$ 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的守护进程”。。此处不是完整的命令。使用:
docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)
docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)
。。。它对所有容器执行“docker inspect”(docker inspect)。docker ps——没有trunc
将显示完整命令以及运行容器的其他详细信息。使用:
docker inspect -f "{{.Name}} {{.Config.Cmd}}" $(docker ps -a -q)
docker inspect -f "{{.Path}} {{.Args}} ({{.Id}})" $(docker ps -a -q)
这将显示命令路径和参数,类似于git repository中的
docker ps
使用runlike
安装runlike
pip install runlike
由于它接受容器id作为参数,所以要提取容器id,请使用以下命令
docker ps -a -q
您可以使用runlike通过以下命令提取完整的docker run命令
runlike <docker container ID>
runlike
将迪伦的评论转换成完整的答案,因为太有用了:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER
它有什么作用?在容器内运行,获取完整的docker运行命令,然后为您删除容器。TL-DR
docker ps--no trunc
和docker inspect CONTAINER
提供启动容器时执行的入口点,以及传递给的命令,但这可能会遗漏一些部分,例如${ANY_VAR}
,因为容器环境变量未按解析方式打印
为了克服这一点,docker inspect CONTAINER
有一个优势,因为它还允许从Config.env
属性中分别检索容器中定义的环境变量及其值
docker ps
和docker inspect
提供有关已执行入口点及其命令的信息。通常,这是一个包装器入口点脚本(.sh
),而不是容器启动的“真实”程序。要获取相关信息,请使用ps
或/proc/1/cmdline
帮助请求流程信息
1)
docker ps——无trunc
它打印入口点和为所有正在运行的容器执行的命令。
当它打印传递到入口点的命令时(如果我们传递该命令),它不会显示docker环境变量的值(例如$FOO
或${FOO}
)。如果我们的容器使用env变量,这可能是不够的 例如,运行alpine容器:
docker run --name alpine-example -e MY_VAR=/var alpine:latest sh -c 'ls $MY_VAR'
docker inspect alpine-example | grep -4 Cmd
使用docker-ps时,例如:
docker ps-a--filter name=alpine示例--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
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
命令也在那里,但我们仍然看不到env变量值:
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
],
事实上,我们无法使用这些docker命令查看插值变量。作为权衡,我们可以使用docker inspect分别显示容器的command和env变量:
docker inspect alpine-example | grep -4 -E "Cmd|Env"
上面印着:
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
"Env": [
"MY_VAR=/var",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sh",
"-c",
"ls $MY_VAR"
]
docker的另一种方法是使用docker inspect
的--format
标志,该标志允许指定要呈现的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]
我指定1
,因为入口点执行的进程通常是具有1
id的进程
如果没有ps
,我们仍然可以在/proc/1/cmdline
中找到信息(在大多数Linux发行版中,但不是全部)。例如:
docker exec CONTAINER cat /proc/1/cmdline | sed -e "s/\x00/ /g"; echo
如果我们可以访问启动容器的docker主机,那么获取入口点执行的进程的完整命令的另一个替代方法是:
:执行ps-PID
,其中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}}"'
谢谢,这帮了大忙。请注意:“-notrunc”已被弃用,替换为
--no trunc
。这对我不起作用。它给了我命令,但不是所有的开关(这是我在使用“完整命令”时想到的)。上面提到的其他链接的runlike命令对我来说更有效。对于仅运行容器的完整命令,只需删除all命令<代码>docker ps--无trunc谢谢--已更正。我以前的命令适用于所有容器,而不只是运行容器,这是最初的问题。不受信任的命令可能很长,每行只能看到前400个字符,带有docker ps--all--no trunc | cut-c-400
这不显示docker ps命令。docker ps命令对应于docker inspect Path和Args.No bueno(截至2018年1月i.e.)docker-inspect-f“{{.Name}{{.Path}{.Args}}{{.Args}}$(docker-ps-a-q)
如果您只是在命令前面抛出sudo
,您将得到“docker-inspect”至少需要一个参数。
由于第二次调用是为了获取所有容器名称,您可能需要在中添加一个sudo$(
。对于那些想要更好地理解-f查询的人,我在这里找到了一个很好的解释,您如何修改它来搜索特定的命令,例如kube apiserver
?@Jonathandocker inspect-f{{.Path}{.Args}({.Id})$(docker ps-a-q)| grep kube apiserver
请参见此处:不工作。显示“命令”['docker','inspect',u'06e6a369f909']'返回非零退出状态1”您是否安装了我提到的runlike即使更好,您也可以在docker容器中运行runlike并避免安装它:docker-run--rm-v/var/run/docker.sock:/var/run/docker.sock/runlike-YOUR-container