我使用了下面的dockerfile,它是关于一个aspcore 7 web应用程序的。
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 ["WebApplication3.csproj", "."]
RUN dotnet restore "./WebApplication3.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "WebApplication3.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "WebApplication3.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication3.dll"]
应用程序配置如下
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>81f43918-ec08-492f-91d0-94f7160b54d5</UserSecretsId>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<DockerfileContext>.</DockerfileContext>
<PlatformTarget>ARM64</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
</ItemGroup>
</Project>
发布到DockerHub时使用以下设置
运行时设置为linux-arm64
上传后,操作系统/体系结构显示为linux/amd64
,而不是linux-arm64
最后,当容器启动时,它会退出并显示错误
exec /usr/bin/dotnet: exec format error
我在这里做错了什么?这个错误和架构有关吗?如果这是真的,为什么我在发布时有不同的架构?
PS:容器托管在一个树莓pi 4中。
1条答案
按热度按时间lnvxswe21#
Raspberry有
arm
架构,构建在x86-64
上的Docker映像不能在那里运行。在Linux arm64 Tags section here中有
arm
Docker映像。您需要使用buildx构建它。