4

我正在将 Docker Compose 用于我的本地开发环境,用于全栈 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,这就是我添加- ../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",

我的问题是,

当我使用 更新 docker 容器中的节点模块时npm install,它会my-shared-module从我的私人 Git 存储库中下载到/code/node_modules/my-shared-module中,并且会覆盖 host 中的文件../my-shared-module,因为它们是同步的。

所以我的问题是,是否可以在 Docker 中进行 1 路卷同步?

  • 当主机更改时,更新容器
  • 当容器发生变化时,不要更新主机?
4

2 回答 2

5

不幸的是,我认为这在 Docker 中是不可能的。除非您认为只读挂载是单向的,否则挂载主机卷始终是双向的,但这会阻止您使用npm install.

您最好的选择是每次都使用新文件重建映像,或者CMD将已安装的文件复制到已安装卷之外的新文件夹中。这样,任何文件更改都不会保留回主机。

于 2019-05-03T02:38:29.530 回答
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 "$@"
于 2019-05-03T03:11:36.390 回答