在Visual Studio 2017中展示多个Docker容器的交互式控制台

3

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

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

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

这是我的docker-compose文件:

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' 但是在运行Service2容器时,Visual Studio会进行以下覆盖:
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需要获取一些控制台输入,所以我需要在交互式控制台中按下“Enter”键。不幸的是,我没有看到任何控制台窗口打开 - 但我可以在Debug-Window中看到我的Service2的输出,提示我按Enter键 - 我只是无法按下Enter键。

根据这个问题,对于C++项目,有一个所谓的“Linux Console”在Debug菜单中 - 但我没有这个按钮。我还尝试通过安装“Visual C++ for Linux-Development”功能来获取它,但没有帮助。

这是我的Debug菜单的样子: No Linux Console button 有什么想法如何打开一个控制台窗口来控制我的docker容器中的应用程序吗?

顺便说一句:等待Enter的应用程序仅用于开发目的,因为它将命令发送到RabbitMQ管道而不使用Web前端。可以在docker外部启动它,但这将破坏“按一个按钮运行所有组件”的舒适性(而且不需要设置多个启动项目),并将docker和非docker组件混合到我的解决方案中。


在这种情况下,哪个服务正在等待输入?service1还是service2 - Tarun Lalwani
这是Service2。我也尝试在docker-compose文件中将Service1与Service2交换,但没有成功。 - Christoph Sonntag
@Compufreak,你有找到解决方法吗?我也遇到了同样的问题。 - Johnny Oshika
很不幸,我无法回忆起3年前我是如何解决这个问题的,也找不到那个项目来查看。我可能没有找到解决方案,否则我应该会在这里发布回复。抱歉! - Christoph Sonntag
1个回答

3

注意:由于需要格式化,目前将评论用作答案

您需要对docker-compose进行两个更改。

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文件中,并通过在docker容器中注入某种命令来启动进程,因此docker attach可能抓取tail -f /dev/null而不是我的应用程序 :/ - Christoph Sonntag
你能在问题中也发布override yml吗? - Tarun Lalwani
我的override.yml文件只包含version:3,我认为你要的是Visual Studio使用的那个。我将Visual Studio的Docker输出添加到了我的问题中,它应该包含你所要求的内容。 - Christoph Sonntag
那会使这更加复杂。https://unix.stackexchange.com/questions/31824/how-to-attach-terminal-to-detached-process - Tarun Lalwani
这看起来很有前途,但不幸的是,我遇到了与@Compufreak相同的问题。我无法连接到由Visual Studio启动的.Net Core控制台容器。 - Johnny Oshika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接