如何在 phusion/passenger-nodejs docker 容器中定义启动文件

How to define startup file in phusion/passenger-nodejs docker container

我正在尝试根据 phusion/passenger-docker.

在 docker 容器中获取 next.js 应用程序 运行ning

我认为我有一个基于 passenger-docker 文档的完整设置,但我从 nginx 获得了一个 404 页面。

A docker 日志转储显示 passenger 或 nginx,正在寻找 index.html

[error] 48#48: *1 "/home/app/nhe_app/index.html" is not found

我的启动文件是/home/app/nhe_app/server.js

Dockerfile 最终阶段:

# Build production container from builder stage
FROM phusion/passenger-nodejs:1.0.8

# Set correct environment variables.
ENV HOME /root
ENV NODE_ENV=production

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]

# Enable Nginx and Passenger
RUN rm -f /etc/service/nginx/down

WORKDIR /home/app/nhe_app
RUN rm /etc/nginx/sites-enabled/default

COPY --chown=app:app ./nhe_app.conf /etc/nginx/sites-enabled/nhe_app.conf
COPY --chown=app:app ./secret_key.conf /etc/nginx/main.d/secret_key.conf
COPY --chown=app:app ./gzip_max.conf /etc/nginx/conf.d/gzip_max.conf

COPY --chown=app:app --from=builder /app/server.js /app/.env /home/app/nhe_app/
COPY --chown=app:app --from=builder app/src /home/app/nhe_app/src
COPY --chown=app:app --from=builder app/node_modules /home/app/nhe_app/node_modules

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

nginx 配置 - nhe_app.conf:

server {
    listen 80;
    server_name glen-mac.local;
    root /home/app/nhe_app/server.js;

    passenger_enabled on;
    passenger_user app;
    passenger_startup_file server.js;
}

我希望乘客会启动 nginx 和 运行 我的应用程序。

当我构建并启动 docker 容器时,它似乎期望 index.html.

我正在构建 docker 容器 docker image build -t nhe_app .

并且运行将其与 docker container run --name nhe_app -p 80:3000 nhe_app

浏览 http://glen-mac.local/ 显示 nginx 的格式化 404 页面。

如何配置 passenger-docker 来查找并执行我的 server.js 而不是 index.html

OP题中有几个细微的问题。

最值得注意的是,Passenger 似乎要求在上面的 nginx 配置中由 root 定义的应用程序根路径有一个名为 public 的顶级文件夹。此文件夹不得包含 index.html 文件,并且可能应该为空。这已在示例中显示,但并未在文档中明确说明为硬性要求。

第二个主要错误是 Passenger 绕过了应用程序 server.js 中指定的端口(本例中为 3000),并将其替换为 nginx 配置中指定的端口。所以 docker 运行 命令从:

docker container run --name nhe_app -p 80:3000 nhe_app

docker container run --name nhe_app -p 80:80 nhe_app.

否则,我能给的最好的建议是:

  1. 通过本地安装(无 Docker)了解 Passenger basics。运行 Passenger 演示应用程序。
  2. 让您的应用在本地 Passenger 安装中运行。
  3. 将您学到的知识应用到 passenger-docker.
  4. 中实现您的应用程序