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
的脚本,但是这有一些注意事项:
-
root
会拥有package.json
- 这打破了一个典型的节点开发人员的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
。 你避免了不可避免的版本不匹配和其他令人头痛的事情。