【Nginx】Dockerfile中的CMD开头不是”/usr/sbin/nginx”,而是”nginx”

首先

出于以下原因,当使用Nginx官方映像并根据CMD指令编写时,可能会导致无法正常运行。下面将提供处理方法。

CMD的开头是nginx,而不是/usr/sbin/nginx。

如果将CMD的开头设置为/usr/sbin/nginx,可能会导致Docker容器内的/docker-entrypoint.sh无法正常工作。
因此,CMD的开头应该是nginx而不是/usr/sbin/nginx。

在/docker-entrypoint.sh文件的公式部分中,有以下描述。


...

if [ "$1" = "nginx" -o "$1" = "nginx-debug" ]; then

...

在Dockerfile中,ENTRYPOINT [ “/docker-entrypoint.sh” ]表示执行/docker-entrypoint.sh脚本,CMD的描述会成为/docker-entrypoint.sh的参数。
所以上述条件式中的$1表示CMD的第一个参数。
只有当CMD的开头不是nginx或者nginx-debug时,条件语句中的处理才不会执行。
由于在这个条件语句中执行/docker-entrypoint.d/目录下的文件,所以如果设置CMD [“/usr/sbin/nginx”, “-g”, “daemon off;”]等命令,这些文件将不会被执行。

配置在/docker-entrypoint.d/中的文件有以下三个。

    • 10-listen-on-ipv6-by-default.sh

 

    • 20-envsubst-on-templates.sh

 

    30-tune-worker-processes.sh

20-envsubst-on-templates.sh文件中包含了用于在配置文件中使用环境变量的处理程序。
当以/usr/sbin/nginx开头的CMD命令运行时,该文件不会被执行,配置文件将不会被展开环境变量而生成。

根据以上内容,CMD需要以nginx而不是/usr/sbin/nginx开始。

以compose.yml文件中的command或容器启动时指定命令来实现上述功能是相同的。