【问题标题】:Docker containers do not work when run from command line从命令行运行时 Docker 容器不起作用
【发布时间】:2019-11-27 00:36:45
【问题描述】:

我一直在使用 Docker 开发一个 ASP.NET 应用程序,当我通过 Visual Studio 启动它时,它运行良好!但是,如果我尝试从命令行(或 powershell,或 VS 的 CLI/Powershell)运行任何东西,它会运行,但它生成的容器会拒绝所有连接。

我在安装了 Docker Desktop 的 Windows 10 NT 上尝试运行 ubuntu:18.04 映像(我也尝试过 Alpine、ubuntu:16.04)。

重现步骤:

-在 Visual Studio 中创建一个默认的 ASP.NET 应用程序

-添加 Docker 支持

-选择“Docker”运行

-打开浏览器,导航到 localhost:[YourPort]

-成功!按预期工作。

然后,使用相同的图像或下载的图像(我尝试dockersamples/static-site 确认这不是特定项目的问题):

-打开CMD

-在不同的端口上运行docker run -p [HostPort]:[ContainerPort] [SameImageVSUses:tag]

-看到docker ps 显示两个容器彼此相邻运行

-打开浏览器(火狐),得到错误

The connection was reset

更新

我将 ASP.NET 应用程序的程序类更改为使用 0.0.0.0 而不是 localhost,我认为这是必要的,但现在我明白了

Secure Connection Failed PR_END_OF_FILE_ERROR_

如果我curl localhost:[MyPort],我会得到(52) empty reply from server

/更新

嗯,也许 Visual Studio 做了更多我不知道的事情。

一点点挖掘表明是的,它会引发大量额外的争论!使用 Visual Studio 的复制/粘贴命令确实给了我......完全相同的错误。

为了澄清,容器仍然运行 从命令行,我可以 ssh 或 docker inspect 它们(事实上,VS 启动和 CMD 启动的容器 docker inspect 是相同的除了它绑定到的网络地址)。在构建和启动容器的过程中,我根本没有收到任何错误消息,所以如果它的某些部分失败,它会默默地这样做。

我对 Docker 比较陌生,但我似乎找不到解决这个问题的方法,甚至找不到它背后的原因。 Visual Studio 在做什么而我没有?我已经尝试了我所知道的一切,我什至不得不擦拭我的机器(不相关的),当我重新安装所有东西时发生了完全相同的事情。我的直觉告诉我这是我机器上的东西,但是 VS 启动的那个也应该失败,对吧?

如果我正在运行 CLI 的东西,我找不到任何可以告诉我翻转魔法开关的东西,而且我对 dockerfile 或命令参数所做的任何事情似乎都不起作用。我从未使用过 VirtualBox 或 Docker Toolbox,这不应该是一个被旧程序搞砸的不稳定配置,因为 从 Visual Studio 启动时它工作正常!啊!

我希望这确实是一个我没有翻转的神奇开关,否则我不了解我正在使用的东西。

【问题讨论】:

    标签: asp.net visual-studio docker


    【解决方案1】:

    如果您尝试运行最近的 VS 模板,您只需按照以下说明操作:

    进入Api项目目录:

    cd ./src/YourApiDirectory
    

    构建命令:

    docker build -f ./Dockerfile --force-rm -t yourapiimage:dev ..
    

    运行命令:

    docker run -it --rm -e "ASPNETCORE_ENVIRONMENT=Development" -p 58817:80 --name yourapiname yourapiimage:dev
    

    请注意,最后一个命令中的“-it”标志将以“交互”模式运行您的图像。另请注意,我仅通过端口 58817 使用 http 连接。

    【讨论】:

      【解决方案2】:

      当直接使用 Docker 配置文件(通过 Visual Studio 中的 docker-compose 文件完成)启动时,屏幕后面的 Visual Studio 会合并不同的覆盖文件并执行不同的任务,其中之一是在容器中附加远程调试器等。

      为了帮助您,我通过 Visual Studio 2019 创建了一个示例 asp.net core api,并选择了 .Net Core 3.0。

      以下是我通过 VS2019 启动 API 时 VS2019 在我的机器上生成的 docker-compose。

      docker-compose  -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.yml" -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.override.yml" -f "C:\Users\myuser\source\repos\testwebcore\obj\Docker\docker-compose.vs.debug.g.yml" -p dockercompose14364360289538262671 --no-ansi up -d --build --force-recreate --remove-orphans
      

      我可以通过运行以下命令直接在 powershell 上运行,这里我使用的是 VS2019 默认创建的覆盖文件中使用的相同设置。您必须从项目文件夹外的父文件夹运行此命令。

      docker-compose  -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.yml" -f "C:\Users\myuser\source\repos\testwebcore\docker-compose.override.yml" up
      

      如果您直接使用 docker 文件而不是 docker-compose 构建和运行

      您可以使用以下命令构建,并且像以前一样应该从项目文件的外部文件夹运行。

      docker build -f testwebcore/Dockerfile -t testcore
      

      构建镜像后,您可以使用以下命令运行它,但在此之前您需要创建证书并将几个环境变量传递给运行命令。 following page. 中提到了这方面的细节。特别是 Linux 的 Windows 子系统部分。我在我的 Windows 10 笔记本电脑上运行 Linux 容器。

      所以你必须运行以下命令来生成证书

      dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p testpassword
      

      所以上面生成的带有环境变量和证书的完整运行命令如下。

      docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_Kestrel__Certificates__Default__Password="testpassword" -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx -v c:\users\myuser\.aspnet\https:/https/ testcore:latest
      

      【讨论】:

        【解决方案3】:

        感谢您的建议,结果令人沮丧。我认为这是两个问题的结合:

        这些东西可能会给其他人带来问题,但我错了,这对我不起作用

        首先,没有多少 docker 配置会告诉您的网站监听容器内的任何内容。我相信当我最初尝试大多数修复程序时,该网站没有监听任何内容。

        真正的问题是 .csproj Properties 文件夹中的 launchSettings.json 显然会覆盖命令行中的参数!

        还记得我说过“...与第一个...一起运行它”吗?这意味着我从来没有在正确的端口集上运行网站。显然,-p 8001:443 -e ASPNETCORE_HTTPS_PORT=443 不足以让站点监听 443。您还必须在 launchSettings.json 中设置sslPort。我想这就是生活。

        这终于奏效了

        我在解决方案目录中运行了docker-compose up。而已。我在 VS 中查看时没有看到 docker-compose.yml,所以我没有考虑它,但这只是因为 VS 没有显示解决方案级别的项目。我猜 VS 正在做而我没有做的事情是运行 docker-compose 而不是单独的命令。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          相关资源
          最近更新 更多