Estoy intentando que una aplicación next.js se ejecute en un contenedor de docker basado en phusion / passenger-docker.

Tengo lo que creo que es una configuración completa basada en la documentación del pasajero-acoplador, pero obtengo una página 404 de nginx.

Un volcado de registro de Docker muestra que el pasajero o nginx está buscando index.html

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

Mi archivo de inicio es /home/app/nhe_app/server.js

Etapa final de 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/*

Configuración de 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;
}

Espero que el pasajero inicie nginx y ejecute mi aplicación.

Cuando construyo e inicio el contenedor docker, parece esperar index.html.

Estoy construyendo el contenedor Docker con docker image build -t nhe_app .

Y ejecutándolo con docker container run --name nhe_app -p 80:3000 nhe_app

Navegar a http://glen-mac.local/ muestra la página 404 formateada de nginx.

¿Cómo puedo configurar el puerto de pasajeros para buscar y ejecutar mi server.js en lugar de index.html?

0
gihrig 2 oct. 2019 a las 13:26

1 respuesta

La mejor respuesta

Hay varios problemas sutiles en la pregunta OP.

En particular, Passenger parece requerir que la ruta raíz de la aplicación, definida por root en la configuración de nginx anterior, tenga una carpeta de nivel superior llamada public. Esta carpeta no debe contener un archivo index.html y probablemente debería estar vacía. Esto se muestra en ejemplos, pero no se detalla como un requisito estricto en los documentos.

El segundo error importante es que Passenger omite el puerto especificado en el server.js de la aplicación (3000 en este caso) y lo reemplaza con el puerto especificado en la configuración de nginx. Entonces, el comando docker run cambió de:

Ejecutar contenedor docker --name nhe_app -p 80: 3000 nhe_app

Para

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

De lo contrario, el mejor consejo que puedo dar es:

  1. Aprenda los conceptos básicos sobre pasajeros a través de una instalación local (sin Docker). Haga que funcione la aplicación de demostración Passenger.
  2. Haga que su aplicación funcione en esa instalación local de pasajeros.
  3. Aplica lo que has aprendido para implementar tu aplicación en pasajero-docker
0
gihrig 5 oct. 2019 a las 07:39