【问题标题】:How to get docker toolbox to work with .net core 2.0 project如何让 docker 工具箱与 .net core 2.0 项目一起使用
【发布时间】:2017-08-24 19:46:40
【问题描述】:

我在尝试将 Docker 功能用于我的 .NET core 2.0 项目时遇到错误。我收到一条错误消息,说

Visual Studio 容器工具需要先运行 Docker 构建、调试或运行容器化项目。如需更多信息, 请看:http://aka.ms/DockerToolsTroubleshooting

我点击链接,发现我有 Windows 10 Home x64,并且必须安装 Docker Toolbox,而不是 Docker For Windows。现在它安装了这个名为

的可执行文件

Docker 快速入门终端

这是启动 docker 服务的方式吗?我试过运行这个可执行文件,它似乎正在工作。我的容器正在运行,但 Visual Studio 容器工具的错误仍然存​​在。

我错过了什么?在 Visual Studio 2017 中使用 Docker 容器支持是否需要高于 Home 的 Windows 版本?

更新:

我尝试遵循 Quetzcoatl 的建议,但我仍然在 Visual Studio 中遇到关于这些工具的相同错误。这是我在 Docker 快速启动终端中运行的内容。我在 Visual Studio 成功打开项目后尝试构建项目,但仍然收到上述有关容器工具的错误。

我的 devenv.exe 文件位于

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe

我的解决方案文件位于

D:\Development\Visual Studio\Musify2\Musify2\Musify2.sln

更新 2:

我在 docker quickstart 终端中运行了一些建议的命令来尝试,这里是这些命令的结果 quetz

【问题讨论】:

  • 题外话,但您将获得更好的 Docker for Windows 体验。是否有机会改为更新到 Windows 10 专业版?
  • 我希望不必花 100 美元来升级。同样,根据 Windows 文档,Docker Toolbox 应该足以实现相同的结果,但是,这个问题似乎暗示了不同的体验。
  • 你设法让它运行了吗?我刚刚检查了快速入门中的屏幕截图和环境变量似乎很好。如果您从其中运行 VS,它应该能够读取它们,然后打开/构建解决方案应该没问题。运行 VS 后,您可以使用 ProcessHacker2 检查 VS 进程是否从该控制台继承了这些环境变量。如果确实如此,则错误应该消失了,因为这完全与构建期间缺少的那些变量有关。

标签: c# docker asp.net-core visual-studio-2017 microservices


【解决方案1】:

使用 Docker Toolbox 有点棘手,但实际上 core-2.0 与这里无关。都是关于 docker、docker-toolbox 和 VS 的。

首先:

这是启动 docker 服务的方式吗?我试过运行这个可执行文件,它似乎可以工作。

是的。如果 docker 机器/服务正在运行 - 那很好!

现在,您必须意识到,在 docker 中,有关 docker 运行方式/运行位置的信息通常保存在环境变量中。 quickstart 脚本不仅为您启动 docker-machine 并检查一些基本内容,它还设置了几个环境变量,以便稍后所有命令(如 dockerdocker-compose 等)知道在哪里寻找 docker虚拟机。在您/我们的情况下,该信息主要由 VM 的 IP 和 Docker 侦听的端口号组成。

.. 而您的 Visual Studio 对此一无所知,因为我敢打赌,您已经从 StartMenu 或桌面图标或双击解决方案文件运行了 VisualStudio,因此它没有机会获得来自quickstart 控制台的环境变量。

解决方案非常简单:确保 VS 获取该信息。也就是说,确保它获取环境变量,确保它获取它们的新鲜状态,因为 IP/端口有时可能会波动。所以不要只是将它们复制到您的操作系统设置中,因为没有任何东西会自动刷新它们..

我发现最简单的方法是关闭 Visual Studio,运行 docker toolbox 快速启动控制台,然后从该控制台中运行 VisualStudio,例如,对于我的 VS2017 社区版:

Starting "default"...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
(.......snip..........)


                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

Start interactive shell
quetzalcoatl@LAP049 MINGW32 ~
$ /c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/Community/Common7/IDE/devenv.exe C:\\PATH\\TO\\MY\\SOLUTION.sln

要编写的路径很长,即使是 TAB 补全,所以通常制作一个小的 .sh 脚本来为我运行它。

顺便说一句!请注意,DEVENV 的路径必须类似于 unix (/c/Program\ Files...),因为 mingw shell 必须理解这一点,而 SOLUTION 的路径必须是普通的 Windows 路径 (c:\projects\foo\bar\..),因为 VisualStudio 将在之后尝试读取它启动。

【讨论】:

  • @destructi6n:那个 .sh 字面意思只是该屏幕文本末尾的最后一行。/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/Community/Common7/IDE/devenv.exe C:\\PATH\\TO\\MY\\SOLUTION.sln
  • 我更新了原来的问题。这似乎对我不起作用。我在 Visual Studio 中仍然遇到同样的错误
  • @destructi6n: (1) 只是为了清楚一点,在从该控制台运行 VS 并打开解决方案后,确实得到了完全相同的消息:Visual Studio Container Tools requires Docker to be running before (..) 还是不同的? (2) 在启动 VS 之前尝试运行 docker-machine statusdocker container ls 以查看它是否可连接和运行 (3) 还尝试 docker-machine envset | grep DOCKER 以查看所有变量是否设置正确。 set 应该显示与第一个相同的内容。后来VS进程应该也有它们,可以查一下ie。使用 ProcessHacker2
  • 我用您建议的各种命令的结果更新了@quetzalcoatl 问题。如果按照您建议的命令一切正常,我会尝试 ProcessHacker。
  • 如果有人也很有趣的话,它在 Windows 8.1 Pro 中的作用就像一个魅力
【解决方案2】:

这就是我使用 docker-toolbox 在 windows 10 home 上使用 vs 2017 所做的。你遵循这个,我保证它会起作用。请注意,这仅适用于不支持 Windows 应用程序的原生 docker 的 Windows 10 家庭版:

  1. 在 w10 主页上安装 docker-toolbox

  2. 运行一次 docker QuickStart 终端以创建 docker-machine。这需要一段时间。所以在分配 IP 地址和其他东西时请耐心等待

  3. 完成后,它会显示一个命令提示符。输入“docker-machine ip default”。记下 IP 地址,以备日后使用

  4. 关闭 QuickStart 终端窗口。那只是将小型 Ubuntu linux 服务器的 boot2docker.iso 映像初始化为 virtualbox 应用程序(又名 docker-machine 又名默认 vm)。如果您不熟悉虚拟化技术或 oracle virtualbox,请先停止阅读并阅读它们,然后重新开始。但是如果你这样做了,那么很乐意继续

  5. 正如我提到的,您的 docker-machine 实例是 Linux 虚拟机,因此很明显您只能打开使用 .net 核心技术构建的项目。不幸的是,对于完整的 .net 框架,您要么需要运行仅在 windows 10 pro 上可用的 Windows 容器,要么在 virtualbox 上构建自己的 windows nano server 或 2016 server vm,然后在 dockers 网站上使用并按照本机 docker for windows 的步骤操作.从这里开始,这个答案的其余部分将对那些只想在 Linux vm / docker-machine 上运行核心项目的人有所帮助

  6. 以管理员模式打开 windows power shell 并键入“docker-machine ls”以确认默认 vm 正在运行。也可以做'docker-machine status default',它应该返回'running'

  7. 现在打开运行默认虚拟机的 virtualbox 应用程序,然后单击设置。打开“共享驱动器”选项卡,您需要确保主机上的“c:\Users”文件夹映射/安装为 vm 中的“c/Users”文件夹。请注意,这一步非常重要,错过它会导致很多麻烦,使其无法成功运行

  8. 另外请注意,您的解决方案/项目/代码库必须保存在“c:\Users\”下才能正常工作。这是如果您想使用它 OOTB。我不想浪费时间尝试在允许的路径之外安装文件夹。但是,如果您是喜欢冒险的人,请务必尝试弄清楚并告诉我们您是如何做到的

  9. 现在,正如 Quetzalcoatl 正确提到的那样,vs 需要了解这个 docker-machine。发生的唯一方法是设置环境变量。因此继续运行这个命令'docker-machine env default | Powershell 窗口中的 Invoke-Expression。这是让 docker-machine 表现良好的魔法酱

  10. 通过 dbl 单击您的项目解决方案或创建新项目/解决方案来正常打开 vs。 在 Powershell 中使用“开始”命令打开现有的 vs 解决方案或新与实例。专业提示:如果您创建一个新的解决方案,请不要在选择项目模板类型时选择 Linux docker 选项。一旦您的解决方案设置完毕并准备就绪,您就可以完全添加 docker 支持。事实上,不要检查它,让 vs 创建您的解决方案。这样,您将有机会在 IIS Express 或自托管模式下构建和运行您的解决方案,以查看您的 core2.0 是否正常工作

  11. 一旦对一切工作感到满意并且您看到了 OOTB 主页,现在是时候添加 docker 支持了,方法是 rt 单击您的项目,将鼠标悬停在“添加”上,然后单击“添加 Docker 支持”。这将创建一个新的 docker 项目(.dcproj)并添加一堆 docker 相关文件

  12. 现在我不打算在这里详细介绍 docker,但是您会注意到您的项目不再是启动项目,而新创建的 docker 项目是。这是完全正常和预期的行为。这意味着您已设置好并准备好使用 docker 容器启动您的应用程序。所以继续点击“Docker”按钮,看看你的辛勤工作终于得到了回报。再次耐心等待,因为构建映像和启动容器需要一段时间,但一旦完成,vs 将启动并附加调试器

  13. 在这里,您会再次感到失望并感到一文不值,因为当浏览器打开新窗口或标签时,会出现页面无法访问的错误。原因是浏览器地址指向 localhost,它不再是 Web 服务器。您的“网络服务器”现在是您的 docker 容器,因此您需要将 localhost 替换为您在上面检索到的 IP 地址。端口号保持原样。提交页面后,您会欣喜若狂地看到主页/路由工作。这也应该在 vs 中启​​用调试。如果由于某种原因它没有启用,那么您可能需要删除 c:\Users\ 文件夹中名为 .vsdbg 的文件夹并重新运行应用程序。

【讨论】:

  • 感谢您的精彩教程。但是我还有一个关于此处未描述的 powershell 版本的问题。 stackoverflow.com/questions/50085195/…
  • 是的。您应该可以编辑我的回复。您可以在副标题中添加以下项目,例如注意事项或其他内容。
  • 感谢您的指导,第 6 步出现错误“以管理员模式打开 windows power shell 并输入 'docker-machine ls' 以确认默认 vm 正在运行。也可以执行 'docker -machine status default' 并且它应该返回 'running'” powershell 不应该处于管理员模式,它不会在 ls 中找到任何项目,因为它会在管理员模式下查找机器列表,但我们在用户模式下安装它们所以如果您在正常模式下打开 Power shell,则此步骤将起作用! @BRBdot
  • "...powershell 不应该处于管理员模式..." 是的,这也是我发现的,请更新这个原本很好的答案,因为这一步让我有些不知所措
  • @MaxCarroll Powershell 在管理员模式下提升了某些命令的权限,否则这些命令将不起作用。您能否描述在管理员模式下尝试上述操作时遇到的问题?我不是 100 相信管理员模式是您遇到问题的原因。希望你能理解。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2012-11-02
  • 2020-04-13
  • 2018-12-08
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多