【问题标题】:How to setup multiple visual studio solutions working together using docker compose (with debugging)如何使用 docker compose 设置多个 Visual Studio 解决方案协同工作(带调试)
【发布时间】:2020-08-08 18:42:10
【问题描述】:

似乎有人问过很多关于在一个使用 docker compose 的解决方案中获取多个项目的问题,但没有一个解决多个解决方案的问题。

为了设置场景,我们有多个 .NET Core API,每个 API 作为单独的 VS 2019 解决方案。它们都需要能够(至少)使用在本地运行的同一个 RabbitMQ 容器,因为它处理服务之间的所有通信。

我已经能够通过以下方式使此设置适用于单一解决方案:

  • 为 API 项目添加“容器编排支持”。
  • 这在我为其创建的解决方案中创建了一个新的 docker-compose 项目。
  • 更新 docker-componse.yml 以包含 RabbitMQ 和 MongoDb 图像(见下图 - 抱歉,我无法将其正确粘贴为文本/代码):

现在,当我启动所有新的 RabbitMQ 和 MongoDB 容器时。

然后我用另一个解决方案做了完全相同的事情,不出所料,它无法启动,因为 RabbitMQ 端口已经在使用中(即它试图创建另一个新的 RabbitMQ 映像)。

我有点预料到这一点,但不知道正确配置它的最佳/正确方法,任何帮助或建议将不胜感激。

【问题讨论】:

    标签: visual-studio docker .net-core docker-compose


    【解决方案1】:

    通过将context 的值设置为适当的相对路径,我已经能够从多个解决方案组合多个服务。使用您的 docker-compose 示例并添加 my-other-api-project 您最终会得到以下内容:

    services:
        my-api-project:
          <as you have it currently>
    
        my-other-api-project:
          image: ${DOCKER_REGISTRY-}my-other-api-project
          build:
            context: ../my-other-api-project/    <-- Or whatever the relative path is to your other project
            dockerfile: my-other-api-project/Dockerfile
          ports:
              - <your port mappings>
          depends_on:
            - some-mongo
            - some-rabbit
    
        some-rabbit:
          <as you have it currently>
    
        some-mongo:
          <as you have it currently>
    

    【讨论】:

    • 这很酷,我会多研究一下。最后,我意识到我可以为每个解决方案拥有单独的 docker compose 文件(都在同一个自定义 docker 网络上),然后我编写了几个 powershell 脚本来启动每个脚本(只需转到文件夹并调用“ docker-compose up -d" 以及一个遍历每个文件夹并构建它们的工具(如果我必须这样做的话)。在大多数情况下,它可以很好地处理不时发生的一些奇怪的事情。
    【解决方案2】:

    所以我想我会回答我自己的问题,因为我认为我最终找到了一个好的(不完美的)解决方案。我做了以下步骤:

    1. 创建了自定义 docker 网络。
    2. 为我的 RabbitMQ、SQL Server 和 MongoDB 容器创建了一个 docker-compose.yml(使用我的自定义网络)。
    3. 为每个服务设置 docker-compose 容器编排支持(右键单击 API 项目并选择添加容器编排)。
    4. 上述步骤使用docker-compose.yml和docker-compose.override.yml在解决方案中创建docker-compose项目
    5. 然后我编辑 docker-compose.yml 以便容器使用我的自定义 docker 网络并专门指定端口号(因此它们始终相同)。
    6. 我编辑了 docker-compose.override.yml 环境变量,以便我的连接字符串指向我的 docker 网络(即 RabbitMQ、SQL Server 和 MongoDB)上的相关容器名称 - 不再需要担心 IP,当我将解决方案设置为在调试模式下使用 docker-compose 项目启动,我的调试容器可以访问这些服务。
    7. 现在我可以关闭 VS 解决方案并转到命令行并导航到解决方案文件夹并运行“docker-compose up”来启动容器。
    8. 我按照步骤 3-7 设置了每个 VS 解决方案,并且可以在本地启动任何/所有服务,而无需再打开 VS(前提是我不需要调试)。
    9. 当我需要调试/更改服务时,我会停止特定容器(即“docker container stop containerId”,然后在 VS 中打开解决方案并在调试模式下启动它/进行更改等。
    10. 如果我拉下其他人所做的更改,我会在命令行上通过转到解决方案文件夹并运行“docker-compose build”来重新构建相关容器。
    11. 作为奖励,我编写了 PowerShell 脚本来使用每个 docker-compose 文件启动我的所有容器,并使用一个来构建它们,因此当我打开笔记本电脑时,我只需运行它以及我的完整开发环境和 10 项服务已启动并运行。

    在大多数情况下,这很有效,但有一些警告:

    • 我使用 https 和 dev-certs,有时事情不顺利,我必须清理证书/重新信任它们,因为 kestrel 会抛出错误并期望证书是可信的、具有特定名称并且是可信的.我正在努力改进这一点,但你总是不能在 dev 本地使用 https。
    • 如果您像我一样使用自己的 nuget 服务器,则需要一个 Nuget.config 文件并将其复制到您的 docker 文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2021-10-14
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多