如何通过 Dockerfile 中的 docker RUN 安装@types/node

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

当我使用以下 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 ./ ./
,但它也不起作用

docker npm docker-compose
2个回答
0
投票

您确定您的 @types/node 中指定的

package.json
版本
没有冲突吗?例如,假设您已在
package.json
:

中指定了此内容
"@types/node": "^16.0.0"

从 Dockerfile 安装

这样的东西将使您能够从

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 安装

恕我直言,更好的选择是将软件包安装完全移至

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"
  }
}

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 安装在容器中,但这已经是另一个问题了。

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