node.js - npm install 与 docker-compose 项目

标签 node.js docker npm docker-compose

我有一个 Docker 化项目,其中包含三个应用程序和三个数据库。这三个应用程序都是用 Node 编写的,并像往常一样使用 npm

我有一个克隆三个存储库的脚本,docker-compose.yaml 安装三个容器,并为三个项目中的每一个使用 Dockerfile 来基本上执行以下操作npm install 并运行它们。

这一切都工作正常,但本次练习的重点是为了开发目的而使项目集群易于设置和运行。实际上,处理项目代码并不是问题,因为它是由开发人员克隆的,但 npm install 是通过 docker 和 root 完成的。这意味着存储库中的 node_modules 归 root 所有。

开发人员不能简单地执行 npm install 来将新包添加到存储库,因为他们没有 node_modules 的权限,并且该模块可能会使用不同的架构取决于其主机系统。

我曾考虑过创建一个在容器中运行 npm install 的脚本,但这有一些注意事项:

  1. root 将拥有 package.json
  2. 这打破了典型的 Node 开发人员的流程...他们习惯于只执行 npm install

正如我上面所说,这样做的全部目的是使其尽可能容易地投入和开发,因此我希望尽可能接近通用的开发体验。

对于在 Docker 容器中安装 Node 模块以开发项目有什么建议吗?

最佳答案

安装源文件夹的常见问题,到目前为止我想出的最佳解决方案是简单地将主机用户的 uid/gid 与容器中的某个固定用户相匹配。直到最近,人们还不得不求助于一些外部工具和 dockerfile/compose 模板,使用最新的 docker-compose 版本(>=1.6.0),您现在可以执行以下操作:

Dockerfile:

FROM busybox
ARG HOST_UID=1000
RUN adduser -D -H -u ${HOST_UID} -s /bin/sh npm
USER npm
RUN echo "i'm $(whoami) and have uid: ${HOST_UID}"

注意ARG指示。 HOST_UID 的值在运行时通过 docker build --build-arg HOST_UID=${UID} 传递。然后只需添加一个自定义 npm 用户,并将 HOST_UID 值作为其 uid 并将其设置为默认 USER对于以下所有命令。

--build-arg 现在也受到 docker-compose 和新版本 2 yml 格式的支持:

version: '2'
services:
  foo:
    build:
      context: .
      args:
        HOST_UID: ${UID}

如果您的主机上设置了 UIDdocker-compose up foo 将使用与您的 uid 匹配的默认用户来构建镜像主人。我从中学到的重要教训是,uid/gid 对于权限而言至关重要,实际的用户/组名称无关紧要。

我使用过几次的另一种技术是在容器启动时通过 sed 替换 /etc/passwd/ 中固定用户的 uid,如果某个环境是放。这可以避免图像重建,并且适用于预计直接从某个存储库运行的图像。

最后,我建议完全接受 docker 理念,这意味着您的开发人员应该仅将项目容器用于 npm install 等任务。您可以避免不可避免的版本不匹配和其他令人头疼的问题。

关于node.js - npm install 与 docker-compose 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35632825/

相关文章:

node.js - vue + vite + ubuntu 20 个错误

linux - 如何增加 linux 上的最大套接字连接数?

javascript - 使用express.io 将 Angular Controller 转换为实时数据

reactjs - 在 React 中安装 particle.js 时出现 NPM ERR

node.js - Nodejs Pkg - 如何使用外部配置文件?

python - 如何解密由加密 AES 算法加密的字符串

docker - 将导出图像从一台服务器保存到另一台服务器

python - 在 alpine docker 容器中安装 psycopg2

c# - 无法将 ASP.NET 应用程序连接到 Docker 上的 SQL Server

typescript 找不到本地链接的模块?