我在尝试 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。
与 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:
设置。)
我在多阶段 docker 构建中遇到了类似的问题。我的第一阶段仅安装依赖项(node_modules),第二阶段部署节点应用程序。
我在下一阶段专门复制了node_module,而不是复制所有内容,然后它解决了我的问题。
可以在 API Dockerfile 的生产阶段尝试一下吗?
COPY --from=development /{your WORKDIR}/node_modules ./node_modules