我有一个 Docker 化项目,其中包含三个应用程序和三个数据库。这三个应用程序都是用 Node 编写的,并像往常一样使用 npm
。
我有一个克隆三个存储库的脚本,docker-compose.yaml
安装三个容器,并为三个项目中的每一个使用 Dockerfile
来基本上执行以下操作npm install
并运行它们。
这一切都工作正常,但本次练习的重点是为了开发目的而使项目集群易于设置和运行。实际上,处理项目代码并不是问题,因为它是由开发人员克隆的,但 npm install 是通过 docker 和 root 完成的。这意味着存储库中的 node_modules
归 root 所有。
开发人员不能简单地执行 npm install
来将新包添加到存储库,因为他们没有 node_modules
的权限,并且该模块可能会使用不同的架构取决于其主机系统。
我曾考虑过创建一个在容器中运行 npm install
的脚本,但这有一些注意事项:
root
将拥有package.json
- 这打破了典型的 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}
如果您的主机上设置了 UID
,docker-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/