【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或容器启动时指定命令来实现上述功能是相同的。