npm安装一个docker-compose项目

我有一个dockerized项目,有三个应用程序和三个数据库。 这三个应用程序是写在节点和像往常一样使用npm

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

这一切工作都很好,但是这个练习的整个目的是使项目集群易于build立和运行以达到发展的目的。 实际上在项目代码上工作并不是问题,因为它被开发人员克隆,但是npm install是通过docker和root来完成的。 这意味着repos中的node_modules属于root。

开发人员不能简单地执行npm install来向repo添加新的软件包,因为他们对node_modules没有权限,并且可能会根据主机系统使用不同的体系结构构build模块。

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

  1. root会拥有package.json
  2. 这打破了一个典型的节点开发人员的stream程…他们习惯于做npm install

就像我上面所说的那样,整个过程就是尽可能的容易地进入和发展,所以我想尽可能接近一个共同的发展经验。

是否有任何build议来处理Docker容器中的节点模块的开发项目的安装?

安装源文件夹的一个常见问题,到目前为止我所提出的最佳解决scheme是简单地将主机用户的uid/gid与容器中的某个固定用户进行匹配。 直到最近,人们不得不求助于一些外部工具和dockerfile /撰写模板,使用最新的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相匹配的默认用户来构build映像。 我在那里学到的重要教训是, uid/gid对于权限来说都是重要的,实际的用户/组名是不相关的。

另外一个我用过几次的技术是,如果设置了某个env,则在容器启动时通过/etc/passwd/通过sedreplace固定用户的uid 。 这避免了图像重build,适用于预期直接从某个存储库运行的图像。

最后,我会build议完全接受docker的理念,这意味着你的开发者应该只使用项目容器的任务,如npm install 。 你避免了不可避免的版本不匹配和其他令人头痛的事情。