我正在Nginx部署在Docker容器中(在OpenShift上)。如果我在Dockerfile中使用ENTRYPOINT ["sleep", "infinity"]
,然后在容器内发出nginx -g "daemon off;"
,则Nginx将按预期在容器内启动。但是,如果我在Dockerfile中使用ENTRYPOINT ["nginx", "-g", "daemon off;"]
,则容器在启动时会产生以下错误消息:
nginx:[emerg] bind()到0.0.0.0:8000失败(98:地址已经在 使用)
这种差异的原因可能是什么?
答案 0 :(得分:0)
您应该使用CMD ["nginx", "-g", "daemon off;"]
并将ENTRYPOINT保留为默认值。
答案 1 :(得分:-1)
我现在找到了解决方法。当nginx
如下时,可以从ENTRYPOINT ["/usr/local/bin/start.sh"]
间接启动start.sh
:
#!/bin/bash
nginx
sleep infinity
奇怪的是,在nginx
中对start.sh
的调用仍然会产生相同的错误消息,但是由于sleep infinity
后跟着ENTRYPOINT
脚本,现在可以成功了。仅当我根本不调用nginx
时,错误消息才会消失,但是Nginx也不运行。确实很奇怪。
顺便说一句,我使用的是nginx
的Debian版本,并在user
的{{1}}中调整了/etc/nginx/nginx.conf
指令,以及一些目录权限以满足OpenShift的要求(容器映像不是以Dockerfile
的身份运行,而是以随机uid的身份运行。)
更新 root cause原来是一个错误,原因是同一容器实例在容器内运行两次。这(当然,事后看来)导致同一服务器在同一节点上启动两次,并因此导致有关“第二”容器中绑定的错误消息。到目前为止,我一直只观察到“第二个”容器,因此遇到了错误。解决此问题后,root
现在也可以正常工作。