Gezim
Gezim

Reputation: 7318

npm script fails with sh: 1: <command>: not found in docker container

Question

When running npm run start:debug command inside a docker container, I get this error:

# npm run start:debug

> [email protected] start:debug /usr/src/api
> nest start -e "node --inspect-brk 0.0.0.0:9229" --watch -p tsconfig.json

sh: 1: nest: not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! [email protected] start:debug: `nest start -e "node --inspect-brk 0.0.0.0:9229" --watch -p tsconfig.json`
npm ERR! spawn ENOENT

Running npm ls --depth=0 shows that I have @nestjs/cli installed:

# npm ls --depth=0
[email protected] /usr/src/api
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
...

Why isn't the nest cli binary being found?

My Setup

This is how I launch the shell:

docker-compose -f docker-compose-base.yml -f docker-compose-dev.yml run api /bin/sh

My docker-compose files:

# -base
version: '3'

services:
  api:
    build: .
    restart: on-failure
    volumes:
      - /usr/src/api/node_modules
    container_name: api


# -dev
version: '3'

networks:
  # Use lb_lbnet network created by the load balancer repo (lb)
  # We do this because we need the load balance to resolve container names defined here to forward traffic
  # This is only needed for dev
  default:
    external:
      name: lb_lbnet

services:
  db:
    image: postgres:11
    container_name: db
    restart: always
    env_file:
      - ./db.env # uses POSTGRES_DB and POSTGRES_PASSWORD to create a fresh db with a password when first run
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
      # only used to upload DB dump:
      # - ./backup:/tmp/backup

  api:
    restart: 'no'
    build:
      context: .
      args:
        NODE_ENV: development
    depends_on:
      - db
    ports:
      - 9229:9229
    volumes:
      - ./:/usr/src/api
      - ./node_modules:/usr/src/api/node_modules
      # enable to debug hgezim-express-shopify-auth
      - ../../hgezim-express-shopify-auth:/usr/hgezim-express-shopify-auth
    env_file:
      - .env
    command: /bin/bash -c 'echo "Starting" && npm install && npm run start:debug'

My Dockerfile:

FROM node:12

WORKDIR /usr/src/api

COPY package*.json ./

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

RUN npm install # && npm ls --depth=0 # commented this out since it returns non-zero exit code

COPY . .

VOLUME [ "/usr/src/api/node_modules" ]

RUN ["/usr/local/bin/npm", "run","lint"]
RUN ["/usr/local/bin/npm", "run","build"]

# not using an execution list here so we get shell variable substitution
CMD /bin/bash -c 'npm run start:$NODE_ENV'

Upvotes: 2

Views: 6482

Answers (1)

Son Nguyen
Son Nguyen

Reputation: 1482

Nest CLI needs to be installed globally for the command line to work. Looks like you have it installed locally via package.json so nest was not added to PATH. Either add RUN npm install -g @nestjs/cli to your Dockerfile, or change start:debug script to use the local version (something like node_modules/<nestcli module>/.bin/nest).

Upvotes: 1

Related Questions