当我使用以下 Dockerfile 时:
FROM node:22-alpine
ENV NODE_ENV production
WORKDIR /usr/web-server
RUN npm i -g @nestjs/cli typescript
COPY ./package*.json ./
RUN npm install
RUN npm install @types/node
COPY ./ ./
EXPOSE 4000
CMD npm run start:dev
/usr/web-server/node_modules/@types 节点文件夹内未安装。
但是,如果我使用下面的 Dockerfile:
FROM node:22-alpine
ENV NODE_ENV production
WORKDIR /usr/web-server
RUN npm i -g @nestjs/cli typescript
COPY ./package*.json ./
RUN npm install
RUN npm uninstall @types/node
RUN npm install @types/node
COPY ./ ./
EXPOSE 4000
CMD npm run start:dev
一切正常。
为什么在第一个 Dockerfile
RUN npm install @types/node
中没有在 @types 中安装 node 文件夹?
我在
RUN npm install @types/node
之后尝试COPY ./ ./
,但它也不起作用
您确定您的 @types/node
中指定的
package.json
的 版本没有冲突吗?例如,假设您已在
package.json
: 中指定了此内容
"@types/node": "^16.0.0"
这样的东西将使您能够从
Dockerfile
安装,而无需先卸载。
🗎
Dockerfile
FROM node:22-alpine
ENV NODE_ENV production
WORKDIR /usr/web-server
RUN npm i -g @nestjs/cli typescript
COPY ./package*.json ./
RUN npm install
RUN npm install @types/node
COPY ./ ./
EXPOSE 4000
CMD npm run start:dev
🗎
package.json
(请注意,这不包含 @types/node
、@nestjs/cli
或 typescript
,所有这些都是从 Dockerfile
安装的!)
"name": "nestjs-web-server",
"version": "1.0.0",
"description": "A simple NestJS web server",
"main": "src/main.ts",
"scripts": {
"start:dev": "nest start --watch"
},
"dependencies": {
"@nestjs/common": "^9.0.0",
"@nestjs/core": "^9.0.0",
"@nestjs/platform-express": "^9.0.0"
},
"devDependencies": {
"@nestjs/testing": "^9.0.0",
"prettier": "^2.7.1",
"eslint": "^8.15.0",
"jest": "^29.0.0"
}
}
恕我直言,更好的选择是将软件包安装完全移至
package.json
。通过下面的设置,所有软件包都安装在一个 npm install
命令中。
🗎
Dockerfile
FROM node:22-alpine
ENV NODE_ENV production
WORKDIR /usr/web-server
COPY ./package*.json ./
RUN npm install
COPY ./ ./
EXPOSE 4000
CMD npm run start:dev
🗎
package.json
{
"name": "nestjs-web-server",
"version": "1.0.0",
"description": "A simple NestJS web server",
"main": "src/main.ts",
"scripts": {
"start:dev": "npx nest start --watch"
},
"dependencies": {
"@nestjs/common": "^9.0.0",
"@nestjs/core": "^9.0.0",
"@nestjs/cli": "^9.0.0",
"@nestjs/platform-express": "^9.0.0"
},
"devDependencies": {
"@nestjs/testing": "^9.0.0",
"@types/node": "^20.0.0",
"typescript": "^4.6.3",
"prettier": "^2.7.1",
"eslint": "^8.15.0",
"jest": "^29.0.0"
}
}
在这种情况下,它在第一个 Dockerfile 中不起作用,因为
@type/node
是像 package.json
中的开发依赖项一样安装的
"devDependencies": {
"@types/node": "^20.12.12",
}
当我像 Dockerfile 中的
RUN npm install @types/node
那样安装它时,它不会在 node
中的 @types
中添加 node_modules
文件夹,因为如果它喜欢 devDependeces 包,则 @types/node
不会安装。
跳入 Docker 容器时:
cd /usr/web-server/node_modules/@types
ls
// result empty folder
但是,当我卸载它并再次安装它作为主要依赖项时,它工作正常:
cd /usr/web-server/node_modules/@types
ls
// Now result is node folder
这就是为什么第二个 Docker 文件工作正常
如果我在
@type/node
文件中添加像主要依赖项一样的包 package.json
:
"dependencies": {
"@types/node": "^20.12.12",
}
现在我不需要在 Dockerfile 中添加
RUN npm install/unistall @types/node
。
剩下的问题是为什么 @types/node 没有作为 devDependency 安装在容器中,但这已经是另一个问题了。