My Angular app runs fine locally but I haven’t figured out how to do the same with a Docker image. Outside of Docker, the UI runs on port 4200 with ng serve
and the API serves data from 8080 with node server.js
.
My Dockerfile is set up so it can get the Node server running and available on 8080, but the Angular UI won’t run. I’ve tried several options but right now I have:
FROM node:14.17.3
COPY package*.json ./
EXPOSE 4200 8080
RUN npm install -g @angular/cli
RUN npm install --only=production
COPY . ./
RUN ng serve
CMD ["node", "server.js"]
It fails on ng serve
with the error: The serve command requires to be run in an Angular project, but a project definition could not be found
. I do have an angular.json file in the root. I’m not sure what I am missing. I read that ng serve
shouldn’t be used in this situation but the alternatives I’ve seen haven’t made a difference.
EDIT 8/10/21: Based on the answers here and a bunch of research, this will display the UI with nginx:
FROM node:12.16.1-alpine as build
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
# RUN npm install -g @angular/cli
# RUN npm run build --prod
FROM nginx:1.15.8-alpine
COPY --from=build /usr/src/app/dist /usr/share/nginx/html
# CMD ["node", "server.js"]
However, the npm run build step fails because ng is not found despite installing @angular/cli. I have to run this manually to build the dist folder. And I can’t run node server.js
alongside this. It seems I can only get the front end or back end, not both.
3
Answers
I figured out a solution that will run the full application. Most answers here focus on running the front end (the nginx suggestion was helpful). It seemed a Docker container could enable the UI or server but not both. I came across Docker Compose, which will run the front and back ends in separate images. My solution:
Dockerfile.ui
Dockerfile.server
docker-compose.yml
docker-compose up
will build out an image for server and UI and deploy concurrently. I also resolved theng not found
errors by installing dev dependencies, particularly@angular-devkit/build-angular
.This tutorial helped me figure out Docker Compose: https://wkrzywiec.medium.com/how-to-run-database-backend-and-frontend-in-a-single-click-with-docker-compose-4bcda66f6de
I think updating this line
with
should solve that error. It appears that the node "volume" is in that folder.
Otherwise setting the workdir also seems like a solution:
Source: https://nodejs.org/en/docs/guides/nodejs-docker-webapp/
Use below command at the end to run
ng serve
with host0.0.0.0
which means it listens to all interfaces.CMD ["ng","serve","--host", "0.0.0.0"]
But I would suggest using ngInx.
Steps to follow:
docker build -t my-ng-app .
docker run -dp 3000:80 my-ng-app
Check out my article on this – https://askudhay.com/how-to-dockerize-an-angular-application, and please let me know if you still have any questions.