npm 安装一个 docker-compose 项目

npm install with a docker-compose project

我有一个 docker 化的项目,其中包含三个应用程序和三个数据库。三个app都是用node写的,照常使用npm

我有一个克隆三个 repos 的脚本,docker-compose.yaml 安装三个容器并为三个项目中的每一个使用 Dockerfile 基本上只做一个 npm install 和 运行他们。

这一切都很好,但这个练习的重点是使项目集群易于设置,运行 用于开发目的。实际上,处理项目代码不是问题,因为它是由开发人员克隆的,但是 npm install 是通过 docker 完成的,因此是 root。这意味着 repos 中的 node_modules 归 root 所有。

开发人员不能简单地 npm install 将新包添加到存储库,因为他们没有 node_modules 的权限,并且模块可能会根据他们的不同架构构建主机系统。

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

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

就像我上面说的,这样做的全部目的是让入门和开发尽可能容易,所以我想尽可能接近共同的开发体验。

对于在 docker 容器中处理节点模块的安装以进行项目开发,是否有任何建议?

挂载源文件夹的一个常见问题,到目前为止我想出的最好的解决方案是简单地将宿主用户的uid/gid匹配到容器中的某个固定用户。直到最近,人们不得不求助于一些外部工具和 dockerfile/compose 模板,使用最新的 docker-compose 版本 (>=1.6.0) 你可以做到现在关注:

Docker 文件:

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 directive. The value of HOST_UID is passed at runtime via docker build --build-arg HOST_UID=${UID}. Then just add a custom npm user with the value of HOST_UID as its uid and set it as default USER

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

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

如果在您的主机上设置了 UIDdocker-compose up foo 将使用与您在主机上的 uid 匹配的默认用户构建映像。我在那里学到的重要一课是 uid/gid 是权限的全部,实际的 user/group 名称无关紧要。

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

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