【问题标题】:Microservice Setup微服务设置
【发布时间】:2018-04-14 03:59:03
【问题描述】:

我有几个想要通过 docker-compose 管理的 git 存储库。我还希望 docker-compose 所在的项目是一个 git repo。所以我有以下组织:

UI-Repo --> .git --> Dockerfile

Server-Repo --> .git --> Dockerfile

Local-Development-Repo --> .git --> docker-compose.yml

不幸的是,由于 Docker 的限制,我似乎无法访问 UI-Repo 和 Server-Repo dockerfile。在 Local-Development-Repo 中拥有 UI-Repo 和 Server-Repo 的符号链接也不起作用。所以我可以想到两个选择。

  1. Git 子模块

    • 这种方法的缺点是我需要复制 package.json 并在我的 dockerfile 中执行 npm install,因为 node_modules 在我的 .gitignore 上。我希望这纯粹是为了开发,理想情况下,应该只使用卷而不是在 docker 容器内安装依赖项。
  2. 将 UI-Repo 和 Server-Repo 放在父目录中,其中包含 docker-compose.yml 文件。

    • 这种方法的缺点是我也希望通过 Git 跟踪这个父级。我不认为在包含两个 git repo 的父目录中有 .git 会起作用。

建立具有多个独立 git 存储库的微服务架构并使用 docker-compose 管理这些项目以进行本地开发的建议做法是什么?

【问题讨论】:

  • 如果您希望在您的 docker-compose 中引用其他存储库,为什么需要访问他们的 Dockerfile?您在他们自己的仓库中创建其他 docker 镜像的镜像,并且在您的 docker-compose 中,您只需引用它们。我是否错过了您的用例?
  • @Rash - 我认为 docker-compose 用于更好地管理项目中的许多不同服务,以便您可以简单地执行 docker-compose up 来运行服务器和 UI 服务(没有每次都需要构建和运行每个仓库)。我想为每个项目利用 docker-compose 中的“音量”。这样,如果我在开发过程中更改 UI 上的某些内容,正在运行的服务可以自动检测到它(无需重建和重新运行图像)。
  • 因此,您只需要一个用于所有 UI 项目的基本 dockerfile,其中实际文件将通过 volume 选项加载。单独构建这些 dockerfile,并在您的 docker-compose 中引用这些构建,并将数据挂载到这些构建。您不需要访问其他项目的 dockerfile。
  • 你的问题解决了吗?

标签: node.js docker-compose microservices


【解决方案1】:

您不需要访问其他 UI 项目的 Dockerfile。 对于您的所有 UI 项目,在他们自己的项目中本地构建他们的图像。 然后将这些图像引用到您的 docker-compose 文件中,如下所示。

在引用时,您可以将相应的代码库安装在 docker 中。 这样,即使您更改了 UI 代码,也无需再次重建 docker 映像。

version: "2"
services:
  UIProjectA:
    image: ui_project_A_local_build:0.0.1
    container_name: ui_project_A_local_build
    ports:
      - "8081:8080"
    volumes:
      - /path/to/local/folder/in/project/A:/path/to/docker/folder
  UIProjectB:
    image: ui_project_B_local_build:0.0.1
    container_name: ui_project_B_local_build
    ports:
      - "8082:8080"
    volumes:
      - /path/to/local/folder/in/project/B:/path/to/docker/folder

【讨论】:

  • 在没有任何 cmets 的情况下投反对票是不礼貌的行为。如果回答有问题,欢迎讨论。我测试了我的设置并且它有效,所以我肯定我正确地回答了这个问题。
  • 我不知道谁对你的答案投了反对票(以及下面的@lecstor),但你的工作虽然我最终做了不同的事情,因为我不想手动构建每个回购。我最终得到了类似的结果:Parent - docker-compose.yml(链接到 Local-Development-Repo/docker-compose.yml 的符号) - Local-Development-Repo --> docker-compose.yml - UI-Repo - Server-回购我感谢你的帮助。谢谢!
  • @Chris 对不起,克里斯。我的评论不适合你。我希望你没有被冒犯。关于我的回答,您不必一次又一次地构建您的项目。您只需使用空的 apache2 容器构建一次 UIProjectA 和 UIProjectB,您的 docker-compose 将在启动容器之前挂载实际代码。您的方法的缺点可能是任何其他想要使用相同 Dockerfile 的项目无论如何都必须重建该项目。那么为什么不为每个项目做一次呢。让我知道是否需要详细说明。我可以写具体的命令来把事情说清楚。
【解决方案2】:

我怀疑问题仅出在您的 docker-compose 文件上。我有相同的目录结构,它工作正常。您只需要将构建上下文设置为 repo 目录并在 Local-Development-Repo 中运行 docker-compose。

version: '2.1'
services:
  ui:
    image: ui
    container_name: ui
    build:
      context: ../UI-Repo
  server:
    build:
      context: ../Server-Repo
    image: server
    container_name: server

【讨论】:

  • 我认为这对你有用,因为你指定了一个已经构建的图像。
  • 不,如果图像不存在,当您执行docker-compose up ui 时,它将被构建/创建。如果它确实存在并且您想再次构建,您可以docker-compose build ui。 (如果你只是 docker-compose up 它会根据需要构建/启动所有服务)
【解决方案3】:

我最终做了类似的事情:

Parent-Folder - docker-compose.yml (sym linked to Local-Development-Repo/docker-compose.yml) - Local-Development-Repo - docker-compose.yml - UI-Repo - Server-Repo

这样,我可以跟踪 docker-compose.yml,同时可以通过父文件夹中的docker-compose-up 启动所有服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 2021-08-11
    • 2021-02-02
    • 2020-08-02
    • 2016-08-01
    • 1970-01-01
    • 2021-06-20
    • 2018-12-14
    相关资源
    最近更新 更多