PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, October 18, 2022

[FIXED] How can I setup a docker container for NestJS in production?

 October 18, 2022     docker, docker-compose, dockerfile, nestjs, node.js     No comments   

Issue

I've been trying to setup a docker-compose for an nestjs application, mysql and redis for a while now. I already got the mysql, redis, and nestjs development containers to work fine. The issues come when I try to setup an additional container for nestjs in production, where I've been getting some problems along the way.

In a nutshell, the most common error that I've been getting is that npm is not been able to find the package.json in the current workspace, although I copied it before running the command that causes the error (which are either npm install or npm run build).

/docker-compose.yml

version: '3.8'

networks:
  nesjs-network:
    driver: bridge

services:
    redis:
      container_name: nestjs_redis
      image: redis
      environment:
        - ALLOW_EMPTY_PASSWORD=yes
      networks:
        - nesjs-network
      ports:
        - '${FORWARD_REDIS_PORT:-5003}:6379'
    dev:
        container_name: nestjs_dev
        image: nestjs-api-dev:1.0.0
        build:
            context: ./Docker
            target: development
            dockerfile: Dockerfile
        command: npm run start:dev
        ports:
            - 3000:3000
            - 9229:9229
        networks:
            - nesjs-network
        volumes:
            - .:/usr/src/app
            - /usr/src/app/node_modules
        restart: unless-stopped
        env_file: '.env'
        depends_on:
          - database
          - redis
        links:
          - database
          - redis
    prod:
        container_name: nestjs_prod
        image: nestjs-api-prod:1.0.0
        build:
            context: ./Docker
            target: production
            dockerfile: Dockerfile
        # command: npm run start:prod
        ports:
            - 3000:3000
            - 9229:9229
        networks:
            - nesjs-network
        volumes:
            - .:/usr/src/app
            - /usr/src/app/node_modules
        restart: unless-stopped
        env_file: '.env'
        depends_on:
          - database
          - redis
        links:
          - database
          - redis

    database:
      build:
        context: ./Docker
        dockerfile: mysql8.Dockerfile
      image: mysql/mysql-server:latest
      container_name: database
      restart: unless-stopped
      tty: true
      ports:
        - '${FORWARD_DB_PORT:-3306}:3306'
      env_file: '.env'
      command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --authentication_policy=mysql_native_password --host_cache_size=0
      environment:
          MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
          MYSQL_DATABASE: '${DB_NAME}'
          MYSQL_USER: '${DB_USER}'
          MYSQL_PASSWORD: '${DB_PASSWORD}'
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
          TZ: '${APP_TIMEZONE-America/New_York}'
      networks:
        - nesjs-network
      volumes:
        - dbdata:/var/lib/mysql:rw,delegated

#Volumes
volumes:
  dbdata:
    driver: local

/docker/DockerFile

###################
# BUILD FOR LOCAL DEVELOPMENT
###################

FROM node:18-alpine AS development

WORKDIR /usr/src/app

COPY package*.json ./

# RUN apk add --nocache udev ttf-freefont chromium git
RUN apk add udev ttf-freefont chromium git
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
ENV CHROMIUM_PATH /usr/bin/chromium-browser

RUN npm install -g npm@8.19.2

RUN npm install glob rimraf

# RUN npm install --only=development
RUN npm ci

COPY . .

# Nest line needs to be tested
EXPOSE 3000
EXPOSE 9229


###################
# PRODUCTION
###################

FROM node:18-alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /usr/src/app

COPY package*.json ./

RUN   apk update \                                                                                                                                                                                                      
 &&   apk add ca-certificates wget \
 &&   update-ca-certificates

# RUN apk add --nocache udev ttf-freefont chromium git
RUN apk add udev ttf-freefont chromium git
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true
ENV CHROMIUM_PATH /usr/bin/chromium-browser

# RUN npm install -g npm@8.19.2

# RUN npm install glob rimraf

# RUN npm install --only=production
RUN npm ci

COPY . .

EXPOSE 3000
EXPOSE 9229

COPY --from=development /usr/src/app/dist ./dist
# RUN npm run build

CMD ["node", "dist/main"]

No matter how many tweaks I add or change, I keep getting the same kind of errors. I also tried using --chown=node:node every time I copy files, and changing to the node user (USER node), but nothing changes.

The most common error I get:

=> ERROR [build 7/8] RUN pm run build
> [build 7/8] RUN nom run build:
#0 0.518 pm ERR! code ENOENT
#0 0.519 nom ERR! syscall open
#0 0.519 pm ERR! path /usr/src/app/package.json
#0 0.520 nom ERR!
errno
-2
#0 0.521 pm ERR! enoent ENOENT: no such file or directory, open '/usr/src/app/package.json'
#0 0.521 pm ERR! enoent This is related to pm not being able to find a file.
#0 0.521 pm ERR! enoent
#0 0.522
#0 0.522 pm ERR! A complete log of this run can be found in:
#0 0.522 nom ERR!
/root/.npm/_logs/2022-10-15T19_02_39_449Z-debug-0.log
failed to solve: executor failed running [/bin/sh -c pm run build]: exit code: 254

Would anyone know what I might be doing wrong? All the containers work fine including the dev one for nestjs, but no luck with making the one for production.


Solution

Just as David suggested in the question's comments, using ./Docker in the docker-compose build context was causing these path issues inside the Dockerfile:

    prod:
        container_name: nestjs_prod
        image: nestjs-api-prod:1.0.0
        build:
            context: ./Docker
            target: production
            dockerfile: Dockerfile

Once I changed it to:

    prod:
        container_name: nestjs_prod
        image: nestjs-api-prod:1.0.0
        build:
            context: .
            target: production
            dockerfile: docker/Dockerfile

the error didn't happen again and npm was able to find the package.json file with no issues!



Answered By - Christian De Santis
Answer Checked By - Marie Seifert (PHPFixing Admin)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing