如何重构.NET应用的Dockerfile以使用Ubuntu 20.04作为基础镜像
问题原因
- 你编写的Dockerfile中多次使用
FROM关键字但未做阶段继承,每次FROM都会生成独立的构建镜像,最终没有将所有运行依赖整合到Ubuntu 20.04的基础镜像中 - 违规引入了
debian:buster-slim、mcr.microsoft.com/dotnet/core/runtime-deps:3.1-buster-slim等禁止使用的镜像 - Ubuntu 20.04默认源中没有
libicu63包,需要替换为对应版本的libicu66
正确实现方案
保留原有构建-发布-最终运行的三层逻辑,仅将运行时基础镜像替换为原生Ubuntu 20.04,所有依赖安装都在该阶段内完成:
# 构建阶段:使用SDK镜像完成代码编译发布,该阶段不会进入最终镜像 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["DockerExplained/DockerExplained.csproj", "DockerExplained/"] RUN dotnet restore "DockerExplained/DockerExplained.csproj" COPY . . WORKDIR "/src/DockerExplained" RUN dotnet publish "DockerExplained.csproj" -c Release -o /app/publish # 最终运行阶段:基于原生Ubuntu 20.04安装所有依赖 FROM ubuntu:20.04 AS final WORKDIR /app EXPOSE 80 # 安装系统依赖和.NET运行时依赖 RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ # .NET Core 3.1 所需依赖 libc6 \ libgcc1 \ libgssapi-krb5-2 \ libicu66 \ libssl1.1 \ libstdc++6 \ zlib1g \ && rm -rf /var/lib/apt/lists/* # 配置环境变量 ENV ASPNETCORE_URLS=http://+:80 \ DOTNET_RUNNING_IN_CONTAINER=true # 安装.NET Core 3.1运行时 RUN dotnet_version=3.1.3 \ && curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$dotnet_version/dotnet-runtime-$dotnet_version-linux-x64.tar.gz \ && dotnet_sha512='e3f6f9b81bc3828b60f7da5a5c341373dc17f971f1de3f2714adcca180a630a60d4b681166fe78434d8b2ce023d2d08eff4f1935ec664130b7f856fa8e1cac2b' \ && echo "$dotnet_sha512 dotnet.tar.gz" | sha512sum -c - \ && mkdir -p /usr/share/dotnet \ && tar -ozxf dotnet.tar.gz -C /usr/share/dotnet \ && rm dotnet.tar.gz \ && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet # 安装ASP.NET Core 3.1运行时 RUN aspnetcore_version=3.1.3 \ && curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$aspnetcore_version/aspnetcore-runtime-$aspnetcore_version-linux-x64.tar.gz \ && aspnetcore_sha512='ced0b7c9faaf250fbee2c850e8941d47a17da06fa8e576d57063fa4bbc6c8435de6ab488b683d4a692cd622e24d9592f11608a1b358074167cf0b76024815611' \ && echo "$aspnetcore_sha512 aspnetcore.tar.gz" | sha512sum -c - \ && tar -ozxf aspnetcore.tar.gz -C /usr/share/dotnet ./shared/Microsoft.AspNetCore.App \ && rm aspnetcore.tar.gz # 复制发布后的应用文件 COPY --from=build /app/publish . ENTRYPOINT ["dotnet", "DockerExplained.dll"]
该方案完全满足要求:
- 最终运行镜像100%基于
ubuntu:20.04构建,未引入任何buster系列镜像 - 保留了原有的分层构建逻辑,代码变更时不会重复下载安装依赖
- 所有.NET运行时依赖均安装在Ubuntu 20.04原生系统内
内容的提问来源于stack exchange,提问作者Lakshmana
相关产品推荐
相关产品推荐

