【问题标题】:1 way sync instead of 2 way sync for Docker Volume?Docker Volume 的 1 路同步而不是 2 路同步?
【发布时间】:2019-05-03 02:24:20
【问题描述】:

我正在使用 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 的自定义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 容器中运行更新我的节点模块时,它会将 my-shared-module 从我的私人 Git 存储库下载到 /code/node_modules/my-shared-module,这会覆盖主机 ../my-shared-module 中的文件,因为它们是同步的。

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

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

【问题讨论】:

  • 复制图片中的文件时,是否可以选择移除 package.json 中的依赖关系?该模块仍然存在,因为它已被映射,只是构建不会尝试获取它。
  • 最后,我意识到这是无法修复的,我们决定转而使用 Git 子模块而不是 NPM 模块。谢谢

标签: node.js docker docker-compose


【解决方案1】:

不幸的是,我认为这在 Docker 中是不可能的。除非您认为只读挂载是单向的,否则挂载主机卷始终是双向的,但这会阻止您使用 npm install 之类的东西修改文件系统。

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

【讨论】:

  • 谢谢。我会选择不每次都重新构建,因为我想保持开发人员的良好体验和快速而简短的反馈循环。我有点明白这实际上是不可能的。只是希望有人有一些想法来解决这个问题..叹息..
  • 您的核心构建-运行-测试循环中是否真的需要 Docker?我倾向于发现在 Docker 之外进行“真正的”开发更容易,并且仅在我部署或多或少完成的代码时才使用 Docker。
  • @DavidMaze 这是我们客户的要求,使用 Docker 以便开发环境简单且易于设置。无论如何,我现在决定使用 Git 子模块而不是 NPM 模块。谢谢
  • 你有没有找到一些理想的方法?我也错过了一些良好的开发者体验。
【解决方案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 "$@"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多