【问题标题】:npm install with a docker-compose project使用 docker-compose 项目安装 npm
【发布时间】:2016-02-27 04:44:29
【问题描述】:

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

我有一个克隆三个 repos 的脚本,docker-compose.yaml 挂载三个容器并为三个项目中的每一个使用Dockerfile,基本上只是执行一个npm install 并运行它们。

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

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

我曾考虑过创建一个在容器中运行 npm install 的脚本,但这有几点需要注意:

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

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

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

【问题讨论】:

    标签: node.js docker npm docker-compose


    【解决方案1】:

    挂载源文件夹的一个常见问题,到目前为止我想出的最佳解决方案是将主机用户的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 这样的任务。您避免了不可避免的版本不匹配和其他令人头疼的问题。

    【讨论】:

    • 您的回答很有道理,但只是几个跟进。 1000 会是我每次都想使用的 UID 吗?您能否再详细说明一下您的最后一段。您指的是哪个版本不匹配的问题?他们还将在他们的主机上编辑和使用代码,而不是在容器中(尽管只要我能记录下我如何不情愿地接受通过容器执行npm install
    • 1000 在这种情况下只是提供的默认值,否则 --build-arg HOST_UID= 甚至成为启动构建的要求。通过版本不匹配,我指的是开发主机和容器内部的工具。使用主机的 IDE 就可以了。
    猜你喜欢
    • 2020-08-14
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多