在Dockerfile中通过RUN命令添加依赖是好的做法吗?

79次阅读
没有评论

问题描述

正在尝试使用多阶段构建为一个Node项目创建镜像。由于项目使用TypeScript,用户使用NestJs。在生产阶段只安装生产依赖项,但这样做将不会安装NestJs CLI。然而,NestJs CLI是将所有TypeScript代码编译为JavaScript所必需的。用户阅读了很多博客和文章,发现大多数人的做法是在生产阶段复制输出文件夹(从TypeScript编译为JavaScript的代码),但用户不想这样做,也不喜欢复制输出文件夹的想法,因为如果只运行生产阶段,它将失败。用户有两个选择,要么将NestJs CLI作为生产所需的依赖项添加到package.json文件中,要么通过Dockerfile的RUN命令添加NestJs CLI,用户想知道哪种方式是正确或最佳的方式。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

我建议在Dockerfile中使用RUN命令来添加NestJs CLI作为依赖项,因为NestJs CLI是应用程序的硬依赖项。这样我们可以在Dockerfile中明确定义NestJs CLI的版本。这样做的另一个好处是,所有类似的应用程序现在都可以使用相同的Dockerfile,任何对NestJs版本的更改现在将成为一个“镜像更改”,而不是一个“应用程序更改”。
以下是在Dockerfile中添加NestJs CLI的步骤:
1. 打开Dockerfile。
2. 在适当的位置添加以下RUN命令:

RUN npm install -g @nestjs/cli

在上面的示例中,我们使用npm命令全局安装了NestJs CLI。
请注意,这种方法将NestJs CLI作为全局依赖项安装到镜像中,这意味着在容器中运行时,NestJs CLI将可用于所有应用程序。

方案2

另一种选择是将NestJs CLI作为生产所需的依赖项添加到package.json文件中。这样做的好处是,可以使用npm或yarn等包管理工具来管理依赖项,并确保在构建镜像时只安装生产依赖项。以下是在package.json中添加NestJs CLI的步骤:
1. 打开package.json文件。
2. 在dependencies部分添加以下内容:

"dependencies": {
  "@nestjs/cli": "^x.x.x"
}

请注意,将^x.x.x替换为您希望使用的NestJs CLI的版本号。
这种方法将NestJs CLI作为应用程序的依赖项安装,这意味着只有在运行npm install或yarn install时才会安装NestJs CLI。

方案选择

根据您的需求和偏好,您可以选择方案1或方案2。如果您希望在构建镜像时将NestJs CLI作为全局依赖项安装到镜像中,并且希望所有应用程序共享相同的Dockerfile,则选择方案1。如果您更喜欢使用包管理工具来管理依赖项,并且只在运行npm install或yarn install时安装NestJs CLI,则选择方案2。
请注意,无论您选择哪种方案,都应该在Dockerfile或package.json中明确指定NestJs CLI的版本,以确保在构建镜像时使用特定版本的NestJs CLI。

正文完