【问题标题】:How to use AWS Elastic Beanstalk multi docker containers?如何使用 AWS Elastic Beanstalk 多 docker 容器?
【发布时间】:2021-11-25 09:09:33
【问题描述】:

我正在尝试使用两个容器(后端和前端)在 Elastic Beanstalk 中创建一个环境。

docker-compose.yml

version: '3.0'

services:

    my_api:
        image: "850977987151.dkr.ecr.sa-east-1.amazonaws.com/my-api:latest"
        environment:
            ASPNETCORE_ENVIRONMENT: Staging
        ports:
            - "9901:80"
        volumes:
            - "./Logs:/app/Data/Logs"

    my_app:
        image: "850977987151.dkr.ecr.sa-east-1.amazonaws.com/my-app:latest"
        ports:
            - "80:80"

发布工作正常,但我的前端(角度)应用程序无法使用端口 9901 上的 api。

错误:

localhost:9901/UserConfiguration/GetAll:1 加载资源失败: 网络::ERR_CONNECTION_REFUSED

如果我访问我的 EC2 实例并运行:

curl http://localhost:9901/UserConfiguration/GetAll

正常工作!

appsettings.json 上的 CorsOrigins 配置:

"ServerRootAddress": "http://localhost:9901",
    "ClientRootAddress": "http://myappqa-env.eba-xasnmn7n.sa-east-1.elasticbeanstalk.com",
    "CorsOrigins": "http://myappqa-env.eba-xasnmn7n.sa-east-1.elasticbeanstalk.com,http://localhost"
  }

Angular appconfig.json:

"remoteServiceBaseUrl": "http://localhost:9901"

我做错了什么?


编辑

即使我在我的 API 中允许任何来源,如下面的代码,我仍然有同样的错误。

services.AddCors(
    options => options.AddPolicy(
        _defaultCorsPolicyName,
        builder => builder
            //.WithOrigins(
            //    // App:CorsOrigins in appsettings.json can contain more than one address separated by comma.
            //    _appConfiguration["App:CorsOrigins"]
            //        .Split(",", StringSplitOptions.RemoveEmptyEntries)
            //        .Select(o => o.RemovePostFix("/"))
            //        .ToArray()
            //)
            .AllowAnyOrigin()
            .AllowAnyHeader()
            .AllowAnyMethod()
            .AllowCredentials()
    )
);

【问题讨论】:

  • [愚蠢的评论]我有一个用于测试的应用程序,它具有类似的架构(Angular UI + App Server)here。我有一个 compose file 可以很好地与 Beanstalk 配合使用。我不清楚的一件事是......是调用localhost的角度/ JS代码吗?如果是这种情况,如果它在客户端运行,它如何工作(这可以解释为什么如果你 ssh 进入实例并针对 localhost 运行 curl 它可以工作)。
  • 也许完全不相关,但为了完整起见,它在我的应用程序中的工作方式是客户端代码连接到 window.location.href(它表示下载客户端代码的 URL)。我的 nginx 服务于 JS 代码而不是代理 API 调用到 API 服务器。 See diagram
  • @mreferre 你的评论一点也不愚蠢,就是这样。我还需要公开我的 API 并在前端使用该地址。如果你想把它作为答案,我会接受它!
  • 哦,太好了。我把这些 cmets 变成了答案。很高兴它有帮助。

标签: .net amazon-web-services docker docker-compose amazon-elastic-beanstalk


【解决方案1】:

我有一个用于测试的应用程序,它具有类似的架构(Angular UI + 应用程序服务器)here。我有一个 compose file 可以很好地与 Beanstalk 配合使用。我不清楚的一件事是......是调用localhost的角度/ JS代码吗?如果是这种情况,如果它在客户端运行,它如何工作(这可以解释为什么如果你 ssh 进入实例并针对 localhost 运行 curl 它可以工作)。

也许完全不相关,但为了完整起见,它在我的应用程序中的工作方式是客户端代码连接到 window.location.href(它表示下载客户端代码的 URL)。我的 nginx 服务于 JS 代码而不是代理 API 调用到 API 服务器。见图:

【讨论】:

    【解决方案2】:

    由于服务在 docker 网络中运行,因此您应该使用服务名称和容器端口从一个服务连接到另一个服务,例如“my_api:80”。端口 9901 是容器主机(EC2 实例)上的端口。服务本身在另一个网络中运行,即 docker 网络。

    【讨论】:

    • 我需要更改 docker-compose 文件中的某些内容吗?我仍然有同样的错误。
    • 相应地更新 .json 文件。让他们使用 my_api:80 。 docker-compose 文件对我来说看起来不错。
    • 我将查看文件,但我已经进行了更改并继续报错。
    • 没用 :(
    猜你喜欢
    • 2017-07-26
    • 2020-07-23
    • 2015-05-01
    • 2015-03-13
    • 2018-12-12
    • 2018-06-20
    • 2017-10-14
    • 2017-05-07
    • 2021-10-29
    相关资源
    最近更新 更多