我使用的代码库中有一个docker run
命令,如下所示(删除了实名和密码(:
docker run -it --rm --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password postgres:11.6 -d2
我知道-d
标志是指--detach
容器,但-d2
是什么?我搞不清楚命令末尾这面旗帜的用途。我也很困惑为什么它在命令的末尾,而不是像其他标志一样在IMAGE
名称之前。
docker命令行是区分顺序的。一旦docker看到一个无法解析的选项或标志,它就会将其视为图像名称。图像名称之后的所有内容都是要运行的命令,而不是默认命令。换句话说:
docker run ${options_to_run} ${image_name} ${command_override}
在postgres映像中,入口点是docker-entrypoint.sh
,默认命令是postgres
。这意味着docker默认情况下将以docker-entrypoint.sh postgres
的形式运行这个容器(它将入口点和命令连接到一个带有要运行的args的命令中(。有了-d2
命令覆盖,它就变成了docker-entrypoint.sh -d2
,入口点脚本可以将其解释为更改其运行方式的选项。入口点对标志有特殊处理:
if [ "${1:0:1}" = '-' ]; then
set -- postgres "$@"
fi
....
exec "$@"
这意味着入口点参数从-d2
修改为postgres -d2
,然后pid 1中的shell被命令行参数取代,postgres
与-d2
参数一起运行。
-d2
是用于指定调试级别的postgres
CLI选项。我们正在使用postgres
CLI选项执行postgres容器。
来自postgres --help
:
-d 1-5 debugging level