【问题标题】:Show interactive console for multiple docker containers in Visual Studio 2017在 Visual Studio 2017 中显示多个 docker 容器的交互式控制台
【发布时间】:2018-03-06 08:13:58
【问题描述】:

我目前正在开发一个带有多个 docker 容器的 .Net Core 项目,其中 2 个是 .NET Core 控制台应用程序,第三个是 RabbitMQ。

我的目标是打开一个控制台窗口,我可以在其中按 Enter 键,至少有一个在 docker 容器中运行的控制台应用程序。

我通过右键单击我的控制台应用程序并单击“添加 => Docker 支持”来添加 docker-support。

这是我的 docker-compose-file:

version: '3'
services:
  service1:
    image: service1
    build:
      context: ./Service1
      dockerfile: Dockerfile
    links:
     - "rabbitmq:rabbit"
  service2:
    image: service2
    build:
      context: ./Service2
      dockerfile: Dockerfile
    links:
     - "rabbitmq:rabbit"
  rabbitmq:
    image: "rabbitmq:3-management"
    ports:
     - "8082:15672"
     - "5672:5672"

这是我的 docker-compose-override.yml: version: '3'

但 Visual Studio 在运行 Service2-container 时会执行以下覆盖:

Service2:
    build:
      args:
        source: obj/Docker/empty/
      context: C:\Develop\vsts_tfs\Service2
      dockerfile: Dockerfile
    entrypoint: tail -f /dev/null
    environment:
      NUGET_FALLBACK_PACKAGES: /root/.nuget/fallbackpackages
    image: service2:dev
    labels:
      com.microsoft.visualstudio.debuggee.arguments: ' --additionalProbingPath /root/.nuget/packages
        --additionalProbingPath /root/.nuget/fallbackpackages  bin/Debug/netcoreapp2.0/Service2.dll'
      com.microsoft.visualstudio.debuggee.killprogram: /bin/bash -c "if PID=$(pidof
        -x dotnet); then kill $PID; fi"
      com.microsoft.visualstudio.debuggee.program: dotnet
      com.microsoft.visualstudio.debuggee.workingdirectory: /app
    links:
    - rabbitmq:rabbit
    volumes:
    - C:\Develop\vsts_tfs\Service2:/app:rw
    - C:\Users\MYUSER\vsdbg:/remote_debugger:ro
    - C:\Program Files\dotnet\sdk\NuGetFallbackFolder:/root/.nuget/fallbackpackages:ro
    - C:\Users\MYUSER\.nuget\packages:/root/.nuget/packages:ro

我的 Service2 需要获得一些控制台输入,所以我需要在交互式控制台中按“输入”。不幸的是,我没有打开任何控制台窗口 - 但我在调试窗口中看到我的 Service2 的输出告诉我按回车 - 我只是无法按回车。

关于this question,对于 C++ 项目,调试菜单中有一个所谓的“Linux 控制台”——但我没有这个按钮。我也尝试通过安装“Visual C++ for Linux-Development”功能来获得它,但它没有帮助。

这是我的调试菜单的样子: 有什么想法可以打开控制台窗口来控制 docker-container 中的应用程序吗?

正如旁注:等待进入的应用程序仅用于开发目的,因为它在不使用 Web 前端的情况下将命令发送到 RabbitMQ 管道。可以在 docker 之外启动它,但它会破坏“通过按一个按钮运行它们”(并且无需设置多个启动项目)的舒适性,并且会添加 docker 和非 docker 组件的混合到我的解决方案。

【问题讨论】:

  • 在这种情况下哪个服务正在等待输入? service1service2?
  • 这是 Service2。我还尝试在 docker-compose 文件中将 Service1 与 Service2 交换,但没有成功。
  • @Compufreak 你有没有找到解决方案?我遇到了同样的问题。
  • 不幸的是,我不记得 3 年前我是如何解决这个问题的,我再也找不到项目来查找它了。我可能没有找到解决方案,否则我应该在此处将其作为回复发布。对不起!

标签: .net docker visual-studio-2017


【解决方案1】:

PS:现在使用 cmets 作为答案,因为我需要格式化

您需要对 docker-compose 进行 2 处更改

version: '3'

services:
  service1:
    image: service1
    build:
      context: ./Service1
      dockerfile: Dockerfile
    links:
     - "rabbitmq:rabbit"
  service2:
    image: service2
    build:
      context: ./Service2
      dockerfile: Dockerfile
    links:
     - "rabbitmq:rabbit"
    stdin_open: true
    tty: true
  rabbitmq:
    image: "rabbitmq:3-management"
    ports:
     - "8082:15672"
     - "5672:5672"

现在docker-compose 不支持从标准输入获取输入并将其传递给容器,因此您无法从调试控制台继续会话。您需要运行另一个终端并运行

docker attach <foldername>_service2_1

基本上您需要提供容器的名称或 ID。然后你按回车容器会继续进一步

【讨论】:

  • 感谢您的回答,不幸的是,它似乎无法与 Visual Studio 调试器一起使用,因为它将 entrypoint: tail -f /dev/null 放入 docker-compose-file 并通过注入某种命令进入 docker-container,所以 docker attach 可能会抓住 tail -f /dev/null 而不是我的应用程序:/
  • 你能在问题中也发布覆盖 yml 吗?
  • 我的 override.yml 只包含 version:3,我认为您要求的是 Visual Studio 使用的那个。我将 Visual Studio 中的 Docker-Output 添加到我的问题中,它应该包含您要求的内容。
  • 这会让事情变得更加复杂,unix.stackexchange.com/questions/31824/…
  • 这看起来很有希望,但可惜我遇到了与@Compufreak 相同的问题。我无法附加到由 Visual Studio 启动的 .Net Core 控制台容器。
猜你喜欢
  • 2018-01-14
  • 2017-02-11
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多