最近试着基于nginx做了一个镜像,在Dockerfile中调用一个脚本,该脚本用来根据启动时传入的参数修改nginx默认的配置文件,然后重启nginx服务。Dockerfile大体如下:
FROM nginx:alpine
ENV backend_api_url xxx
ADD launch.sh /launch.sh
EXPOSE 80
ENTRYPOINT [ "sh", "/launch.sh" ]
然后launch.sh脚本中的主要内容就是修改nginx.conf文件中的配置,执行nginx启动命令。但是写完之后部署发现镜像可以build成功,但是启动容器时总是会失败,试了各种启动方式都不行。
最后查阅资料后发现一个行之有效的办法:在脚本中使用nginx -g "daemon off;"
来启动nginx。
原理分析
在docker容器中pid=1的进程挂掉后整个容器就会挂掉,对于基于nginx的容器而言,默认pid=1的进程就是nginx,但是一旦你在Dockerfile中使用CMD或者ENTRYPOINT之后,这个对应的程序就会替换nginx变为pid=1的进程,比如我上面例子中的launch.sh,而一旦这个脚本执行完退出,这个容器就会停掉。当使用nginx -g "daemon off;"之后就是告诉nginx在启动后不退出,从而保证生成的容器可以正常运行。