我在本地开发环境中使用Docker Compose进行Full Stack Javascript项目。
我的Docker Compose文件的一部分看起来像这样
version: "3.5"
services:
frontend:
build:
context: ./frontend/
dockerfile: dev.Dockerfile
env_file:
- .env
ports:
- "${FRONTEND_PORT_NUMBER}:${FRONTEND_PORT_NUMBER}"
container_name: frontend
volumes:
- ./frontend:/code
- frontend_deps:/code/node_modules
- ../my-shared-module:/code/node_modules/my-shared-module
我正在尝试开发一个名为my-shared-module
的自定义Node模块,这就是为什么我将- ../my-shared-module:/code/node_modules/my-shared-module
添加到Docker Compose文件中的原因。节点模块托管在私有Git存储库中,并在package.json
"dependencies": {
"my-shared-module": "http://gitlab+deploy-token....@gitlab.com/.....git",
我的问题是
当我使用npm install
运行更新docker容器中的节点模块时,它从我的私有Git存储库中将my-shared-module
下载到/code/node_modules/my-shared-module
中,这将覆盖主机{{1 }},因为它们已同步。
所以我的问题是,在Docker中是否可以进行一种方式的卷同步?
答案 0 :(得分:2)
不幸的是,我认为这在Docker中是不可能的。除非您认为只读装载是单向装载,否则总是以两种方式装载主机卷,但这会阻止您使用npm install
之类的东西来修改文件系统。
您最好的选择是每次都用新文件重建映像,或者烘烤到CMD
中,以将已安装文件复制到已安装卷之外的新文件夹中。这样,任何文件更改都不会持久化回主机。
答案 1 :(得分:2)
您可以编写脚本来执行此操作。将您的主机node_modules挂载到容器内的另一个目录,然后在入口点中复制目录:
version: "3.5"
services:
frontend:
build:
context: ./frontend/
dockerfile: dev.Dockerfile
env_file:
- .env
ports:
- "${FRONTEND_PORT_NUMBER}:${FRONTEND_PORT_NUMBER}"
container_name: frontend
volumes:
- ./frontend:/code
- frontend_deps:/code/node_modules
- /code/node_modules/my-shared-module
- ../my-shared-module:/host/node_modules/my-shared-module:ro
然后将入口点脚本添加到您的Dockerfile中,如下所示:
#!/bin/sh
if [ -d /host/node_modules/my-shared-module ]; then
cp -r /host/node_modules/my-shared-module/. /code/node_modules/my-shared-module/.
fi
exec "$@"