Docker Volume是1同步而不是2同步?

时间:2019-05-03 02:24:21

标签: node.js docker docker-compose

我在本地开发环境中使用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中是否可以进行一种方式的卷同步?

  • 主机更改时,更新容器
  • 当容器更改时,不更新主机吗?

2 个答案:

答案 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 "$@"