Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何使用docker compose(带调试)一起设置多个visual studio解决方案_Visual Studio_Docker_.net Core_Docker Compose - Fatal编程技术网

Visual studio 如何使用docker compose(带调试)一起设置多个visual studio解决方案

Visual studio 如何使用docker compose(带调试)一起设置多个visual studio解决方案,visual-studio,docker,.net-core,docker-compose,Visual Studio,Docker,.net Core,Docker Compose,在使用docker compose的单个解决方案中包含多个项目的问题似乎很多,但没有一个解决多个解决方案 为了设置场景,我们有多个.NET核心API,每个API都作为一个单独的VS2019解决方案。它们都需要能够使用(至少)本地运行的相同RabbitMQ容器,因为这将处理服务之间的所有通信 我已经能够通过以下方式使此设置在单个解决方案中工作: 正在为API项目添加“容器编排支持” 这在我的解决方案中创建了一个新的docker compose项目 更新docker-componse.yml以同时

在使用docker compose的单个解决方案中包含多个项目的问题似乎很多,但没有一个解决多个解决方案

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

我已经能够通过以下方式使此设置在单个解决方案中工作:

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

现在,当我启动所有新的RabbitMQ和MongoDB容器时,它们都被创建了

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


我有点期待这一点,但不知道最佳/正确的方式来正确配置这一点,任何帮助或建议将不胜感激

通过将
context
的值设置为适当的相对路径,我能够从多个解决方案组合多个服务。使用docker compose示例并添加我的另一个api项目,您最终会得到如下结果:

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>
服务:
我的api项目:
我的另一个api项目:
图像:${DOCKER_REGISTRY-}我的其他api项目
建造:

上下文:../my other api project/,所以我想我会回答我自己的问题,因为我认为我最终找到了一个好的(不完美的)解决方案。我执行了以下步骤:

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

    • 我使用https和开发人员证书,有时情况不太好,我必须清理证书/重新信任它们,因为kestrel会抛出错误,并希望证书被信任,具有特定的名称和被信任。我正在努力改进这一点,但您不能在开发人员中本地使用https
    • 如果您像我一样使用自己的nuget服务器,则需要一个nuget.config文件,并将其作为docker文件的一部分进行复制

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