npm сценарий не работает с sh: 1: <command>: не найдено в docker контейнере - PullRequest
0 голосов
/ 19 июня 2020

Вопрос

При запуске команды npm run start:debug внутри контейнера docker я получаю эту ошибку:

# npm run start:debug

> api@0.0.0 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! api@0.0.0 start:debug: `nest start -e "node --inspect-brk 0.0.0.0:9229" --watch -p tsconfig.json`
npm ERR! spawn ENOENT

Запуск npm ls --depth=0 показывает, что у меня установлено @nestjs/cli:

# npm ls --depth=0
api@0.0.0 /usr/src/api
+-- @nestjs/cli@6.14.2
+-- @nestjs/common@6.11.11
...

Почему не удается найти двоичный файл nest cli?

My Setup

Вот как я запускаю оболочку:

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

Мои docker - составить файлы:

# -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'

Мой файл Docker:

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'

1 Ответ

0 голосов
/ 19 июня 2020

Для работы командной строки необходимо установить Nest CLI глобально. Похоже, вы установили его локально через package.json, поэтому гнездо не было добавлено в PATH. Либо добавьте RUN npm install -g @nestjs/cli в свой Dockerfile, либо измените скрипт start:debug, чтобы использовать локальную версию (например, node_modules/<nestcli module>/.bin/nest).

...