I have a Dockerfile for a Nestjs project, I start the container with docker-compose. But I am getting some typescript errors during the build stage.
Have been hours and I still not able to find a solution. Anyone has idea how to tackle this? Thanks a lot! Let me know if I have to provide more information
Here is the Dockerfile
FROM node:14.17.0-alpine as base
LABEL maintainer="[email protected]"
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
FROM base as dev
RUN npm install
RUN npm link webpack
COPY .eslintrc.js nest-cli.json tsconfig.json tsconfig.build.json ./
COPY .env /usr/src/app/.env
CMD [ "npm", "run", "start:dev", "--preserveWatchOutput" ]
FROM base as prod
RUN npm install --only=production
COPY . .
RUN npm run build
CMD ["node", "dist/main"]
And the compose file
version: "3.7"
services:
backend:
# container_name: edudb_backend
restart: always
build:
context: .
dockerfile: ./Dockerfile
target: prod
stdin_open: true
tty: true
environment:
- APP_ENV=production
- APP_PORT=8000
volumes:
- ./src:/usr/src/app/src
- ./test:/usr/src/app/test
working_dir: /usr/src/app
ports:
- "8000:8000"
links:
- mysql
depends_on:
- mysql
networks:
- default
mysql:
# container_name: mysql
restart: always
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root
# - MYSQL_USER=root
- MYSQL_PASSWORD=root
- MYSQL_DATABASE=edu_db
ports:
- "3306:3306"
volumes:
- edudb_mysql_data:/var/lib/mysql
networks:
- default
volumes:
edudb_mysql_data:
networks:
default:
name: edudb
CodePudding user response:
RUN npm install --only=production
COPY . .
RUN npm run build
CMD ["node", "dist/main"]
You can't only install production dependencies and expect building (a dev process that requires depDependencies) to work. Most of the time, @types/ packages are saved as devDependencies and are used by Typescript to ensure the types are correct.
Generally speaking, for running the application you should only need production dependencies, and building the application should happen in an earlier stage of a multi-stage dockerfile, like in your dev stage. Then you have prod copy the dist from dev and install only the production dependencies so you can node dist/main without any typescript dependencies

