Estoy tratando de ejecutar una aplicación angular en modo de desarrollo dentro de un contenedor docker, pero cuando lo ejecuto con docker-compose build funciona correctamente, pero cuando intento instalar el contenedor, aparece el siguiente error:
ERROR: for sypgod Cannot start service sypgod: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"npm\": executable file not found in $PATHEl verdadero problema es que no reconoce el comando npm serve, pero ¿por qué?
La configuración sería la siguiente:
Contenedor Docker (Nginx Reverse proxy -> Angular ejecutándose en el puerto 4000)
Sé que hay mejores formas de implementar esto, pero en este momento necesito esta configuración por algunas razones personales.
archivo acoplable:
FROM node:10.9 COPY package.json package-lock.json ./ RUN npm ci && mkdir /angular && mv ./node_modules ./angular WORKDIR /angular RUN npm install -g @angular/cli COPY . . FROM nginx:alpine COPY toborFront.conf /etc/nginx/conf.d/ EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"] CMD ["npm", "serve", "--port 4000"]NginxServerSitio
server{ listen 80; server_name sypgod; location / { proxy_read_timeout 5m; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://localhost:4000/; } }Archivo Docker Compose (la parte importante donde tengo el problema)
sypgod: # The name of the service container_name: sypgod # Container name build: context: ../angular dockerfile: Dockerfile # Location of our DockerfileLa imagen que finalmente se está ejecutando es esta:
FROM=nginx:alpine COPY toborFront.conf /etc/nginx/conf.d/ EXPOSE 8080 CMD ["npm", "serve", "--port 4000"]La primera etapa no tiene ningún efecto (podría COPY --from=... archivos), y si hay varios CMD , solo el último tiene efecto. Dado que está ejecutando esto en una imagen nginx simple, no hay un comando npm , lo que genera el error que ve.
Recomendaría usar Node en el host para un entorno de desarrollo en vivo. Cuando haya creado y probado su aplicación y esté buscando implementarla, use Docker si es apropiado. En su Dockerfile, ejecute ng build en la primera etapa para compilar la aplicación en archivos estáticos, agregue COPY --from=... en la segunda etapa para obtener la aplicación compilada en la imagen de Nginx y elimine todas las líneas CMD ( nginx tiene un CMD predeterminado apropiado). La respuesta de @VikramJakhar tiene un Dockerfile más completo que muestra esto.
Parece que podría estar intentando ejecutar Nginx y el servidor de desarrollo Angular en Docker. Si ese es su objetivo, debe ejecutarlos en dos contenedores separados. Para hacer esto:
Divide este Dockerfile en dos. Coloque la CMD ["npm", "serve"] al final del primer Dockerfile (solo angular).
Agregue un segundo bloque en el archivo docker-compose.yml para ejecutar el segundo contenedor. El contenedor npm serve backend no necesita publicar ports: .
Cambie el nombre de host del servidor backend en la configuración de Nginx de localhost al nombre de Docker Compose del otro contenedor.
Parece que no se puede acceder al npm desde el contenedor. Intenta definir desde dónde intenta ejecutarlo:
docker run -v "$PWD":/usr/src/app -w /usr/src/app node:10.9 npm serve --port 4000fuente: https://gist.github.com/ArtemGordinsky/b79ea473e8bc6f67943b
También asegúrese de que npm esté instalado en la computadora que ejecuta el contenedor docker.
Puedes hacer algo como a continuación
### STAGE 1: Build ### # We label our stage as 'builder' FROM node:alpine as builder RUN apk --no-cache --virtual build-dependencies add \ git \ python \ make \ g++ RUN mkdir -p /ng-app/dist WORKDIR /ng-app COPY package.json package-lock.json ./ ## Storing node modules on a separate layer will prevent unnecessary npm installs at each build RUN npm install COPY . . ## Build the angular app in production mode and store the artifacts in dist folder RUN npm run ng build -- --prod --output-path=dist ### STAGE 2: Setup ### FROM nginx:1.14.1-alpine ## Copy our default nginx config COPY toborFront.conf /etc/nginx/conf.d/ ## Remove default nginx website RUN rm -rf "/usr/share/nginx/html/*" ## From 'builder' stage copy over the artifacts in dist folder to default nginx public folder COPY --from=builder /ng-app/dist /usr/share/nginx/html CMD ["nginx", "-g", "daemon off;"]