【问题标题】:Can start Nginx manually inside Docker container, but not automatically via CMD可以在 Docker 容器中手动启动 Nginx,但不能通过 CMD 自动启动
【发布时间】:2018-11-16 14:50:41
【问题描述】:

我在 Docker 容器中部署 Nginx(在 OpenShift 上)。如果我在 Dockerfile 中使用ENTRYPOINT ["sleep", "infinity"],然后在容器内发出nginx -g "daemon off;",Nginx 会按预期在容器内启动。但是,如果我在 Dockerfile 中使用 ENTRYPOINT ["nginx", "-g", "daemon off;"],容器会在启动时生成以下错误消息:

nginx: [emerg] bind() to 0.0.0.0:8000 failed (98: Address already in 使用)

造成这种差异的原因是什么?

【问题讨论】:

  • 您能否在问题中包含整个 Dockerfile?你有任何类型的入口点吗?

标签: docker nginx openshift


【解决方案1】:

您应该使用 CMD ["nginx", "-g", "daemon off;"] 并将 ENTRYPOINT 保留为默认值。

【讨论】:

    【解决方案2】:

    我现在找到了解决方法。当start.sh 如下时,从ENTRYPOINT ["/usr/local/bin/start.sh"] 间接启动nginx 有效:

    #!/bin/bash
    nginx
    sleep infinity
    

    奇怪的是,在start.sh 中调用nginx 仍然会产生相同的错误消息,但由于它后面跟着sleep infinity,所以ENTRYPOINT 脚本现在可以成功。只有当我根本不调用 nginx 时,错误消息才会消失,但 Nginx 也不会运行。确实很奇怪。

    顺便说一句,我正在使用 Debian 版本的 nginx 并调整 /etc/nginx/nginx.conf 中的 user 指令 Dockerfile 以及满足 OpenShift 要求的几个目录权限(其中容器映像不以 @ 运行987654335@ 但作为随机 uid)。

    更新 root cause 原来是一个错误,即同一个容器实例在一个 pod 内运行了两次。这(当然,事后看来)导致同一服务器在同一节点上启动两次,因此导致有关“第二个”容器中绑定的错误消息。到目前为止,我一直只观察到“第二个”容器,因此遇到了错误。解决此问题后,ENTRYPOINT ["nginx", "-g", "daemon off;"] 现在也可以正常工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      相关资源
      最近更新 更多