Estoy tratando de crear una imagen acoplable que combine nginx y pm2, pero cuando intento ejecutar pm2 de esta manera, pero cuando lo ejecuto de esa manera, aparece el siguiente error:
/bin/sh: [pm2-runtime,: not foundLo extraño es que si anulo el CMD y lo uso así:
sudo docker run -it -p 80:80 frontend-test pm2-runtimeRECONOCE que pm2(-runtime) está instalado. ¿Alguien tiene una idea de cómo puede suceder esta magia negra? La versión anterior generaba las páginas nuxt y las servía estáticamente a través de Nginx, pero ahora quiero convertir eso para usar el modo SSR de nuxt. Mi objetivo es ejecutar la aplicación y luego el proxy inverso a través de Nginx (lo que parece funcionar, excepto que pm2 no quiere ejecutarse). ¡Gracias por adelantado!
A continuación se muestra una versión (un poco simplificada) de mi Dockerfile:
### BUILD STAGE ### FROM node:10-alpine as build-stage WORKDIR /app # Copy only package(-lock).json to enable docker caching COPY /index/package*.json /app/index/ # Install packages before copying source code to use cache where possible WORKDIR /app/index RUN npm install # Copy source code WORKDIR /app COPY . . # Build source code WORKDIR /app/index RUN npm run build ### END BUILD STAGE ### ### PRODUCTION STAGE ### FROM nginx:1.17-alpine as production-stage ARG env_name=dev # Install system dependencies (nodejs to run pm2) RUN apk add --update nodejs nodejs-npm # Copy transpiled sourcecode to production image COPY --from=build-stage /app/index/.nuxt /app/index # Copy config files to production image WORKDIR /app COPY deployment/pm2.js ./ecosystem.config.js COPY deployment/nginx.${env_name}.conf /etc/nginx/nginx.conf # Install pm2 globally RUN npm install pm2 -g RUN pm2 list EXPOSE 80 CMD ["pm2-runtime", "start", "--env", ${env_name}, "&&", "nginx", "-g", "daemon off;"] ### END PRODUCTION STAGEEl problema era que la directiva CMD no puede manejar varios comandos de forma inmediata.
Cambiar el CMD a la siguiente línea solucionó mi problema:
CMD ["sh", "-c", "nginx && pm2-runtime start ecosystem.config.js --env $env_name"] Docker CMD & ENTRYPOINT ejecuta los comandos implícitamente con sh -c, pero para encadenar comandos y/o inyectar variables de entorno, debe "anidar" el sh -c de docker con el suyo propio.
¿Estás seguro de que estás definiendo el CMD como tal?
CMD [ "pm2-runtime", "start", "pm2.json" ]
porque por lo que veo, el mensaje de error dice que está buscando [pm2-runtime, (tenga en cuenta [ al principio , al final) y esto solo es posible si no tiene las comillas alrededor de pm2- tiempo de ejecución Le sugiero que elimine y escriba esas comillas nuevamente, guarde el Dockerfile e intente construir nuevamente.
Acabo de probar con un ejemplo simple
FROM alpine CMD [echo, "'A'" ]Y recibió un mensaje de error similar
/bin/sh: [echo,: not foundAsí que estoy bastante seguro de que este es el caso.