RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1535887
Accepted
Win_D
Win_D
Asked:2023-08-15 00:01:00 +0000 UTC2023-08-15 00:01:00 +0000 UTC 2023-08-15 00:01:00 +0000 UTC

在 Docker 容器中运行实体框架

  • 772

ASP .NET 7 上有一个 Web 应用程序,其中安装了实体框架依赖项(文件WebApplication.csproj):

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>net7.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.10">
        <PrivateAssets>all</PrivateAssets>
        <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      </PackageReference>
      <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
    </ItemGroup>

</Project>

该应用程序在 Docker 容器中运行(文件内容Dockerfile):

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

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



# Добавляем Entity Framework CLI в образ
RUN dotnet tool install --global dotnet-ef --version 7.0.10
ENV PATH "$PATH:/root/.dotnet/tools"



FROM build AS publish
RUN dotnet publish "WebApplication.csproj" -c Release -o /app/publish /p:UseAppHost=false

# Окончательный образ для запуска приложения
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication.dll"]

正如您在文件中看到的,当我们构建映像时,我们设置了dotnet-ef. 接下来,我们在帮助下docker compose up启动容器。

问题是,如果我进入容器 ( docker exec -it <container-id> /bin/bash) 并尝试执行命令dotnet ef(或任何其他命令),我会收到错误:

The command could not be loaded, possibly because:
  * You intended to execute a .NET application:
      The application 'dotnet-ef' does not exist.
  * You intended to execute a .NET SDK command:
      No .NET SDKs were found.

Download a .NET SDK:
https://aka.ms/dotnet/download

Learn about SDK resolution:
https://aka.ms/dotnet/sdk-not-found

尝试Dockerfile添加行:

# Установка .NET SDK для Entity Framework
RUN apt update && \
    apt install -y --no-install-recommends apt-transport-https && \
    apt install -y dotnet-sdk-7.0

但我收到一条消息,指出dotnet-sdk-7.0未找到存储库:

...
5.703 Reading package lists...
6.579 Building dependency tree...
6.766 Reading state information...
6.927 E: Unable to locate package dotnet-sdk-6.0
6.927 E: Couldn't find any package by glob 'dotnet-sdk-7.0'
------
failed to solve: process "/bin/sh -c apt update &&     apt install -y --no-install-recommends apt-transport-https &&     apt install -y dotnet-sdk-7.0" did not complete successfully: exit code: 100

如果我尝试安装 .NET SDK 版本不是 7.0,而是 6.0,也会出现同样的问题。也许有人有如何在 Docker 容器中使用实体框架的工作配置?因为我不知道我的方向是否正确,我的错误在哪里,哪里需要纠正。我将不胜感激任何帮助。

c#
  • 1 1 个回答
  • 35 Views

1 个回答

  • Voted
  1. Best Answer
    Exploding Kitten
    2023-08-15T05:57:05Z2023-08-15T05:57:05Z

    这是因为您放置dotnet-ef了不同的阶段。您Dockerfile使用Multi-Stage Build,它允许您“从多个阶段”构建应用程序:

    • 使用SDK镜像(sdk:7.0)
    • 它允许您进行构建和发布
    • 然后我们获取运行时映像(aspnet:7.0)
    • 并将完成的应用程序复制到该图像
    • 从最终图像中,应用程序启动

    这对于创建最小的映像并且没有不必要的依赖项是必要的,因为。运行应用程序不需要完整的 SDK 映像。off 中描述了其工作原理和使用方法的详细信息。码头工人文档。

    在您的情况下dotnet-ef,它安装在 SDK 映像中,并且不会复制到最终映像中。因此,它不可用,并且运行时映像中的命令dotnet tool ...不起作用。

    你可以解决这个问题:

    • 放弃多阶段构建并始终只使用一个 SDK 映像,但在创建实际生产映像时,多阶段构建被认为是“最佳实践”
    • 或保持原样,但另外dotnet-ef从 SDK 映像复制到最终映像(从文件夹/root/.dotnet/tools/),此处详细描述: https: //andrewlock.net/running-net-core-global-tools-in -非 sdk-docker- 图像/
    • 或者根本不在容器内使用dotnet-ef,而是滚动迁移,例如从主机迁移
    • 3

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5