在 Elastic Beanstalk 上使用 Docker 部署 .NET Core Web API

Posted

技术标签:

【中文标题】在 Elastic Beanstalk 上使用 Docker 部署 .NET Core Web API【英文标题】:Deploying a .NET Core Web API using Docker on Elastic Beanstalk 【发布时间】:2017-01-18 11:09:12 【问题描述】:

我正在尝试使用 Docker 将最低限度的测试 .NET Core Web API 部署到 Elastic Beanstalk,但没有任何成功。


源代码

我在 Visual Studio 中创建了一个全新的 .NET Core Web API 项目,并且没有修改生成的示例代码。之后我在项目的根目录中添加了Dockerfile,内容如下:

FROM microsoft/dotnet:onbuild

EXPOSE 5000

For your curiosity, here's a link to the .NET docker repo.

之后,我在项目的根目录中创建了一个hosting.json 文件。我想将 Kestrel 服务器绑定到容器的所有 IP。 hosting.json 文件有以下内容:


    "urls": "http://*:5000"

为确保应用正在加载该配置文件,我将 Main 方法更改为:

public static void Main(string[] args)

    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("hosting.json", optional: false)
        .Build();

    var host = new WebHostBuilder()
       .UseKestrel()
       .UseContentRoot(Directory.GetCurrentDirectory())
       .UseIISIntegration()
       .UseStartup<Startup>()
       .UseConfiguration(config)
       .Build();

    host.Run();

If needed, here's the documentation on the hosting.json file.

最后,即使我不需要它according to AWS documentation,我在项目的根目录中创建了一个Dockerrun.aws.json,其内容如下:


    "AWSEBDockerrunVersion": "1"

这一切在我的本地机器上运行得很好。我使用以下命令运行它:

docker build -t netcore .
docker run --rm -itp 5000:5000 netcore

我已通过在浏览器中访问 url http://localhost:5000/api/values 来验证它是否有效。它产生了预期的结果!


AWS

现在为了将其部署到 Elastic Beanstalk,我已将整个源代码与 DockerfileDockerrun.aws.json 一起存档。 ZIP 文件中的根目录如下所示:

Controllers/
Properties/
wwwroot/
appsettings.json
Dockerfile
Dockerrun.aws.json
hosting.json
Program.cs
project.json
project.json.lock
Startup.cs
web.config

但是,将这个源包部署到 Elastic Beanstalk,使用单个 Docker 容器单实例环境,会产生以下错误 No Docker image specified in either Dockerfile or Dockerrun.aws.json. Abort deployment.


我做错了什么?我该如何让它发挥作用?

【问题讨论】:

几个小时后,我仍然无法让它工作。我确信我所做的事情有问题,但有一件事是肯定的;错误消息完全不正确。显然指定了一个 Docker 映像......现在,如果只有消息可以指示实际错误。 【参考方案1】:

所以这都是在 Windows 机器上开发的,即 Windows 行尾,似乎 Elastic Beanstalk 没有检测到这一点。这就解释了为什么 Elastic Beanstalk 无法从我的 Dockerfile 中解析出 FROM &lt;image&gt;,因为存在不需要的乱码,因此会出现错误消息 No Docker image specified...

我希望这会引起注意并修复!

与此同时,我正在使用 Visual Studio 插件 Line Endings Unifier,它使我能够右键单击文件并将行尾更改为我想要的任何类型。

【讨论】:

如果您使用的是 eb cli,它使用 git 挂钩,您可以通过让 git control the line endings 来解决这个问题 感谢您的提示!我会调查的:)

以上是关于在 Elastic Beanstalk 上使用 Docker 部署 .NET Core Web API的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Elastic Beanstalk ebextension

在 AWS Elastic Beanstalk 上部署 Laravel 8 后得到 404

如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?

Elastic Beanstalk 的 Hostmanager 无法启动 Apache,EBS 连接缓慢

Elastic Beanstalk 返回错误 - Gradle/Java 应用程序

AWS Elastic Beanstalk 上的 Docker 端口映射