应该如何为 Node.js docker 应用生成 package-lock.json 文件?

Posted

技术标签:

【中文标题】应该如何为 Node.js docker 应用生成 package-lock.json 文件?【英文标题】:How should the package-lock.json file be generated for Node.js docker apps? 【发布时间】:2019-02-16 12:03:27 【问题描述】:

Node.js docker 教程 (https://nodejs.org/en/docs/guides/nodejs-docker-webapp/) 指定应在启动 docker 之前在主机上运行 npm install 以生成 package-lock.json 文件。

npm/node 在宿主机上不可用时如何生成这个文件?

当新的依赖项添加到 package.json 时,应该如何更新 package-lock.json?

npm 指定应该将 package-lock.json 文件签入源代码控制。当 npm install 通过 docker 运行时,它会在容器中生成 package-lock.json 文件——这不是从源代码管理中检出的地方。显而易见的解决方法是在文件更新时将文件从容器复制到主机,但这似乎应该有一个更简单的解决方案。

【问题讨论】:

Npm install 将在容器中运行,作为 docker 构建的一部分。 How do I npm update dependency versions in the package-lock.json?的可能重复 在容器中运行的 npm install 会在容器中生成文件 - 将文件复制到主机以将其签入源代码控制是标准做法吗? 将锁定文件检查到源代码控制中绝对是标准做法(在我使用过的每个包管理器中都有这个概念,每种语言)。 【参考方案1】:

我通常只是创建一个临时容器来运行 npm,而不必在主机上安装 node 和 npm。像这样的:

docker run --rm -v "$(pwd)":/data -w /data -it node bash

然后在 bash 中我运行 npm init 来生成 package.json 和 npm install 来生成 package-lock.json。您可能希望使用 -u "$UID" 使文件也归您的主机用户所有,或者只是在之后将其 chown。

我在安装新软件包时做同样的事情,只是在临时容器上的 bash 中 npm install package

【讨论】:

您也可以尝试使用docker run --rm -v "$(pwd)":/data -w /data -it 'node:alpine' sh 来使用轻量级 alpine 而不是基于 debian 的容器。 -w 有什么作用?我似乎在文档中找不到它。 @srchulo 它为您正在运行的命令设置当前目录(在容器内) @Paul 谢谢!我想也许就是这样,但我删除了它并且我在同一个目录中。也许那是因为我在 Dockerfile 中设置了相同的 WORKDIR。

以上是关于应该如何为 Node.js docker 应用生成 package-lock.json 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Java 应用程序构建 docker 容器

如何为 Azure 上的 Node.js Api 应用启用 BLOB 日志记录?

我应该如何为 Firebase 身份验证创建新的联合身份提供程序

如何为特定令牌、颤振、firebase 消息传递和 node.js 发送通知

如何为多个产品托管相同的代码?

如何为特定版本的 node.js 安装 d.ts?