【问题标题】:How I can build small dotnet core app docker images我如何构建小型 dotnet 核心应用程序 docker 图像
【发布时间】:2021-08-11 12:45:51
【问题描述】:

我有 docker-images 如下:

REPOSITORY                              TAG                IMAGE ID       CREATED          SIZE
user135/todoapi-Go                      latest             0b4cd5e70a9b   18 seconds ago   9.43MB
user135/todoapi                         v1.0.0             5a3a2cfe9692   2 weeks ago      210MB

我确实比较了来自 user135/todoapi-Go (Golang) 的 docker 图像的大小非常小,而不是 (C#/Dotnet) 的 user135/todoapi,而且我检查了我的其他 Dotnet 应用程序是用 docker 构建的有 200mb++大小,

我将这个 Dockerfile 用于我的 dotnet 应用程序,它是在我为项目添加 Docker 支持时从 Visual Studio 生成的:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app

ENV ASPNETCORE_URLS http://+:5000
EXPOSE 5000
EXPOSE 5001

ENV TZ=Asia/Jakarta
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

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

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

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

我的 Go 应用程序 Dockerfile

FROM golang:alpine AS builder
RUN apk update && apk add --no-cache git
WORKDIR $GOPATH/src/mypackage/myapp/

ENV CGO_ENABLED=0
COPY . .

RUN go get -d -v
RUN go build -o /go/bin/main

FROM scratch
COPY --from=builder /go/bin/main /go/bin/main
ENTRYPOINT ["/go/bin/main"]

我的问题在这里:

  • 如何使用小尺寸 docker 图像构建 dotnet 应用程序?
  • 这会影响应用或容器的性能吗?

【问题讨论】:

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


    【解决方案1】:

    您可以通过以“自包含”形式发布 .NET Core 应用程序来缩小图像。这附带了一个警告,即您的应用程序在发布时必须指定运行时。这没什么大不了的,因为您的目标是特定的容器基础映像 (Linux)。可用的最小 Linux 基础镜像是 Alpine,因此您可以在发布时以它为目标:

    dotnet publish --runtime alpine-x64 -c Release --self-contained true -o ./publish
    

    您需要像这样更改 Dockerfile 中的基础映像:

    
    FROM alpine:3.9.4
    
    # Add some libs required by .NET runtime 
    # https://github.com/dotnet/core/blob/master/Documentation/build-and-install-rhel6-prerequisites.md#troubleshooting
    RUN apk add --no-cache \ 
        openssh libunwind \
        nghttp2-libs libidn krb5-libs libuuid lttng-ust zlib \
        libstdc++ libintl \
        icu
    

    这应该就可以了!你应该得到一个只有十几兆字节的图像。

    作为参考,ITNext 的this page 是我提取大部分信息的地方。如果您有问题,您应该可以继续跟进。

    【讨论】:

    • 注意这里的Alpine 3.9.4版本只是一个例子。使用你喜欢的任何版本。
    【解决方案2】:

    刚刚找到这个how-to-build-smaller-and-secure-docker-images-for-net5

    它对我有用:

    REPOSITORY                           TAG                                                     IMAGE ID       CREATED             SIZE
    user135/article                       v1.0.3                                                  4d1997ebec84   31 minutes ago      61.4MB
    user135/catalog                       v1.0.0                                                  89886216a80f   About an hour ago   256MB
    user135/article                       v1.0.2                                                  44946055dac7   About an hour ago   256MB
    user135/catalog                       v1.0.1                                                  f17990b865c6   About an hour ago   61.4MB
    user135/article                       v1.0.1                                                  f17990b865c6   About an hour ago   256MB
    user135/article                       v1.0.0                                                  d2acc4a7beb9   2 hours ago         256MB
    
    

    这是我的 dockerfile 的样子:

    FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS publish
    WORKDIR /src
    COPY ["Article.Api.csproj", "./"]
    
    
    RUN dotnet restore "Article.Api.csproj" --runtime alpine-x64
    
    COPY . .
    RUN dotnet publish "Article.Api.csproj" -c Release -o /app/publish \
        --no-restore \
        --runtime alpine-x64 \
        --self-contained true \
        /p:PublishTrimmed=true \
        /p:PublishSingleFile=true
    
    FROM mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine AS final
    
    RUN adduser --disabled-password \
        --home /app \
        --gecos '' dotnetuser && chown -R dotnetuser /app
    
    RUN apk upgrade musl
    
    USER dotnetuser
    WORKDIR /app
    EXPOSE 5000
    
    COPY --from=publish /src/article.db .
    COPY --from=publish /app/publish .
    ENTRYPOINT ["./Article.Api", "--urls", "http://0.0.0.0:5000"]
    
    

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 2020-02-15
      • 2020-07-16
      • 2021-01-24
      • 1970-01-01
      • 2020-09-12
      • 2019-08-01
      • 2023-03-28
      相关资源
      最近更新 更多