错误:找不到模块“/dmitrich0/frontend/src/app/npm run start”。 Docker

问题描述 投票:0回答:2

我在尝试 docker-compose up 时遇到这些错误:

错误:找不到模块“/dmitrich0/frontend/src/app/npm run start” 实时聊天-nestjs-angular-frontend-1 | 在 Function.Module._resolveFilename (内部/modules/cjs/loader.js:902:15) 实时聊天-nestjs-angular-frontend-1 | 在 Function.Module._load (内部/modules/cjs/loader.js:746:27) 实时聊天-nestjs-angular-frontend-1 | 在 Function.executeUserEntryPoint [作为 runMain] (内部/模块/run_main.js:75:12) 实时聊天-nestjs-angular-frontend-1 | 在内部/main/run_main_module.js:17:47 { 实时聊天-nestjs-angular-frontend-1 | 代码:'MODULE_NOT_FOUND', 实时聊天-nestjs-angular-frontend-1 | 需要堆栈:[] 实时聊天-nestjs-angular-frontend-1 | }

错误:找不到模块“/dmitrich0/src/app/npm run start:dev” 实时聊天-nestjs-angular-api-1 | 在 Function.Module._resolveFilename (内部/modules/cjs/loader.js:902:15) 实时聊天-nestjs-angular-api-1 | 在 Function.Module._load (内部/modules/cjs/loader.js:746:27) 实时聊天-nestjs-angular-api-1 | 在 Function.executeUserEntryPoint [作为 runMain] (内部/模块/run_main.js:75:12) 实时聊天-nestjs-angular-api-1 | 在内部/main/run_main_module.js:17:47 { 实时聊天-nestjs-angular-api-1 | 代码:'MODULE_NOT_FOUND', 实时聊天-nestjs-angular-api-1 | 需要堆栈:[] 实时聊天-nestjs-angular-api-1 | }

API Dockerfile:

############################
#########DEVELOPMENT########
############################
FROM node:14 AS development
WORKDIR /dmitrich0/src/app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000

############################
#########PRODUCTION#########
############################
FROM node:14 AS production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /dmitrich0/src/app
COPY --from=development /dmitrich0/src/app .
EXPOSE 3000
CMD ["node", "dist/main"]

前端dockerfile:

############################
#########DEVELOPMENT########
############################
FROM node:14 AS development
WORKDIR /dmitrich0/frontend/src/app
COPY package*.json ./
RUN npm install
RUN npm install -g @angular/cli
COPY . .
RUN npm run build
EXPOSE 4200

############################
#########PRODUCTION#########
############################
FROM node:14 AS production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /dmitrich0/src/app
COPY --from=development /dmitrich0/src/app .
EXPOSE 8080
CMD ["node", "dist/main"]

docker-compose.yml

version: "3.8"

services:
  api:
    volumes:
      - ./api:/dmitrich0/src/app
      - /dmitrich0/src/app/node_modules
    build:
      dockerfile: Dockerfile
      context: ./api
      target: development
    command:
      - npm run start:dev
    depends_on:
      - postgres
    environment:
      DATABASE_URL: postgres://user:password@postgres:5432/db
      NODE_ENV: development
      PORT: 3000
    ports:
      - "3000:3000"
      - "9229:9229"
  frontend:
    build:
      dockerfile: Dockerfile
      context: ./frontend
      target: development
    command:
      -  npm run start
    volumes:
      - ./frontend:/dmitrich0/frontend/src/app
      - /dmitrich0/frontend/src/app/node_modules
    ports:
      - "4200:4200"
    links:
      - api

第一次使用 Docker。遇到这个错误我该怎么办?

尝试更改卷中的路径,但我不明白为什么有模块“npm run start:dev”和“npm run start”。

只是路径在某个地方写错了,或者我犯了一个现在很难猜的错误,因为我以前没有使用过 Docker。

angular typescript docker build nest
2个回答
0
投票

与 Dockerfile

RUN
指令有两种语法相同,Compose
command:
可以是字符串或单词列表。 如果它是一个字符串,Compose 使用简单的分割算法并且不会自动运行 shell;如果它是一个列表,那么 Compose 会直接使用该单词列表,而不进行任何进一步的处理。

您正在使用 YAML 列表

command:
  - npm run start
# ^   on a second line, with a list marker

因此它被作为单个单词处理,就像您从交互式 shell 中运行

'npm run start'
一样。

简单的解决方法是将其从列表更改为字符串

command: npm run start

您遇到的具体错误是因为

node
图像在其入口点包装器中有一些复杂的逻辑,可以让您
docker run node index.js
而无需重复
node
解释器命令。 如果您传递给它的是实际命令
docker run node npm ...
,那么它就会运行它,但如果命令的第一个单词不是命令,它将通过
node
运行。 所以你会得到相当于
node 'npm run start'
的结果,它会产生这些错误。

(另一种值得考虑的方法,特别是对于前端应用程序来说,是在容器中启动后端

docker-compose up -d api
,然后直接在主机系统上使用 Node 进行日常开发。这可以让你删除不必要的多 -舞台搭建和微妙的
volumes:
设置。)


0
投票

我在多阶段 docker 构建中遇到了类似的问题。我的第一阶段仅安装依赖项(node_modules),第二阶段部署节点应用程序。

我在下一阶段专门复制了node_module,而不是复制所有内容,然后它解决了我的问题。

可以在 API Dockerfile 的生产阶段尝试一下吗?

COPY --from=development /{your WORKDIR}/node_modules ./node_modules

© www.soinside.com 2019 - 2024. All rights reserved.