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
它打印:
容器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
是因为入口点执行的进程通常是带有1
id 的进程。
没有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}}"'