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
的脚本,但这有几个注意事项:
root
将拥有 package.json
- 这打破了典型的节点开发人员的流程......他们习惯于只做
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}
如果在您的主机上设置了 UID
,docker-compose up foo
将使用与您在主机上的 uid
匹配的默认用户构建映像。我在那里学到的重要一课是 uid/gid
是权限的全部,实际的 user/group 名称无关紧要。
我使用过几次的另一种技术是在容器启动时通过 sed 替换 /etc/passwd/
中固定用户的 uid
,如果设置了某个环境。这避免了图像重建,适用于预期 运行 直接来自某个存储库的图像。
最后,我建议完全接受 docker 理念,这意味着您的开发人员应该只将项目容器用于 npm install
等任务。您避免了不可避免的版本不匹配和其他令人头疼的问题。
我有一个 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
的脚本,但这有几个注意事项:
root
将拥有package.json
- 这打破了典型的节点开发人员的流程......他们习惯于只做
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}
如果在您的主机上设置了 UID
,docker-compose up foo
将使用与您在主机上的 uid
匹配的默认用户构建映像。我在那里学到的重要一课是 uid/gid
是权限的全部,实际的 user/group 名称无关紧要。
我使用过几次的另一种技术是在容器启动时通过 sed 替换 /etc/passwd/
中固定用户的 uid
,如果设置了某个环境。这避免了图像重建,适用于预期 运行 直接来自某个存储库的图像。
最后,我建议完全接受 docker 理念,这意味着您的开发人员应该只将项目容器用于 npm install
等任务。您避免了不可避免的版本不匹配和其他令人头疼的问题。