【问题标题】:Docker-Compose YML with ASP.NET Core 2.2 Web API and SQL Server 2017Docker-Compose YML 与 ASP.NET Core 2.2 Web API 和 SQL Server 2017
【发布时间】:2019-08-07 15:11:02
【问题描述】:

我是 Docker (v19.03.0) 的新手,我在 Visual Studio 2019 (v16.2.0) 和 .NET Core 2.2 中使用它,我希望我的 docker-compose.yml 文件能得到一些帮助创建一个由我的 Web API 和 SQL Server 2017 组成的微服务。

目前,我的 Web API 指向 SQL 2017 的容器化 Linux 实例,该实例正在从我的 C:\DockerVolumes 驱动器卷挂载我的数据库。目前,这通过 IIS 工作得很好。

下一步是将我的 Web Api 容器化,我在 Visual Studio 中右键单击我的项目,运行 docker ps -a 后它似乎与我的 SQL 容器一起运行。

这是我的docker-compose.yml

version: '3.7'
services:
    web:
        build:
            dockerfile: Dockerfile
            context: .
        ports:
            - '8080:80'
        depends_on:
            - db
    db:
        image: 'mcr.microsoft.com/mssql/server:2017-latest'
        ports:
            - '1433:1433'
        volumes:
            - 'C:\DockerVolumes:/var/opt/mssql/data'
        environment:
            SA_PASSWORD: 12345678
            ACCEPT_EULA: Y

这是我的 Web API 的 docker-compose.ymlDockerfile 所在的位置:

这是我的 Web Api 的 Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["SnowdonAPI_05/SnowdonAPI_05.csproj", "SnowdonAPI_05/"]
RUN dotnet restore "SnowdonAPI_05/SnowdonAPI_05.csproj"
COPY . .
WORKDIR "/src/SnowdonAPI_05"
RUN dotnet build "SnowdonAPI_05.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "SnowdonAPI_05.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "SnowdonAPI_05.dll"]

在我做任何其他事情之前,我想确保我没有遗漏任何东西(我的yml 文件中的步骤或内容,显然我唯一能想到的关于我的 Web Api 的事情就是更改连接字符串服务启动后到server=db;.....。另外,我不确定SQL是否需要端口映射?

任何帮助将不胜感激,如果需要更多信息,请告诉我。

【问题讨论】:

标签: c# .net docker asp.net-core


【解决方案1】:

对于你当前的 docker-compose 和 dockerfile,dockerfile 的相对路径是错误的。

对于 docker-compose,您指定当前 docker-compose 构建路径为 context: .

对于 dockerfile,您的解决方案和 dockerfile 在同一个文件夹中,但是您使用COPY ["SnowdonAPI_05/SnowdonAPI_05.csproj", "SnowdonAPI_05/"] 构建它,由于找不到SnowdonAPI_05/SnowdonAPI_05.csproj,它将导致错误。

有两种选择:

  1. 将 dockerfile 中的所有源路径更改为相对于 dockerfile 路径,例如将 COPY ["SnowdonAPI_05/SnowdonAPI_05.csproj", "SnowdonAPI_05/"] 更改为 COPY ["SnowdonAPI_05.csproj", "SnowdonAPI_05/"]
  2. 将 docker-compose 移动到父文件夹并将 dockerfile: Dockerfile 更改为 dockerfile: SnowdonAPI_05/Dockerfile

【讨论】:

  • 谢谢,我认为这更容易,因为 Visual Studio 会自动创建 Dockerfile 以配合选项 2。那么,context: . 是否保持不变?我有点困惑,因为它在文档中指出 context 是构建路径,但我们将路径声明为 dockerfile: SnowdonAPI_05/Dockerfile
  • @user1574598 如果您将 docker-compose 移动到父文件夹,您的 docker Dockerfile 将在 SnowdonAPI_05/Dockerfile 中,根据 context: .
  • 我跑了docker-compose up,它挂在这条线上:Recovery is complete. This is an informational message only. No user action is required. 然后我按 CTRL + C,它说gracefully 停止。运行这两个服务后,它以警告开头:warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35] 请参阅我编辑的帖子以获取屏幕截图。
  • @user1574598 看来您的 docker 构建和运行正常,如果您正在运行的项目有任何问题,我建议您打开一个新线程,并与我们分享详细的错误和代码。
猜你喜欢
  • 2020-01-11
  • 2019-05-15
  • 2018-04-12
  • 2020-04-18
  • 2022-10-14
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多