gpt4 book ai didi

c# - 如何在 Dockerfile 中正确缓存 C# dotnet 核心包?

转载 作者:行者123 更新时间:2023-11-30 16:40:37 26 4
gpt4 key购买 nike

我正在尝试构建高效的 dockerfile,因此只有在删除/添加/更新包时才会触发包恢复。这是我尝试过的(基于 official sample ):

FROM microsoft/dotnet:2.0-sdk-stretch AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY ./src/myapp.csproj ./
RUN dotnet restore && \
dotnet add package ILLink.Tasks -v 0.1.4-preview-981901 -s https://dotnet.myget.org/F/dotnet-core/api/v3/index.json

# Copy everything else and build
COPY ./src ./
RUN dotnet publish -c Release -o out -r linux-x64

# Build runtime image
FROM microsoft/dotnet:2.0-runtime-deps
RUN useradd -d /home/dotnet -ms /bin/bash dotnet
USER dotnet
WORKDIR /home/dotnet/app
ENV ASPNETCORE_URLS=http://+:9999
COPY --from=build-env /app/out ./
ENTRYPOINT ["./myapp"]

我正在复制 csprog,运行 dotnet restore,然后复制其余文件并构建。这应该具有预期的行为 - 仅在需要时恢复包。但这不是发生的事情 - 由于某种原因(在文档中找不到任何相关信息)dotnet publish 触发恢复,尽管包已经缓存:

Sending build context to Docker daemon  131.3MB
Step 1/13 : FROM microsoft/dotnet:2.0-sdk-stretch AS build-env
---> 17fc4fa98e0b
Step 2/13 : WORKDIR /app
---> Using cache
---> 9b13d975844b
Step 3/13 : COPY ./src/myapp.csproj ./
---> Using cache
---> fed39192abce
Step 4/13 : RUN dotnet restore && dotnet add package ILLink.Tasks -v 0.1.4-preview-981901 -s https://dotnet.myget.org/F/dotnet-core/api/v3/index.json
---> Using cache
---> efcdaf201661
Step 5/13 : COPY ./src ./
---> a50fd8fa6106
Removing intermediate container 9eadb5543dbe
Step 6/13 : RUN dotnet publish -c Release -o out -r linux-x64
---> Running in 3bf17790a376
Microsoft (R) Build Engine version 15.7.177.53362 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

Restoring packages for /app/myapp.csproj...
Restore completed in 1.4 sec for /app/Hamuste.csproj.
Installing <redacted>
Installing <redacted>
Installing <redacted>

我错过了什么?我该如何改进这个 docker 文件?

最佳答案

大体上看起来是正确的。 dotnet publish(或 dotnet build)将触发包恢复 - 这是您不能忽略的事情。但它应该只是确保一切就绪,而不是安装任何东西。

但是我怀疑是 dotnet add package 导致了这个问题。我从未使用过该命令,但来自 https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-add-package我明白,它只是将包添加到依赖项,然后你应该运行 dotnet restore。 Doc 说,你不必这样做,因为 new build run (显然 publish)会运行无论如何恢复

我的建议是还原步骤 4/13 命令。首先,执行 dotnet add package,然后执行 dotnet restore。或之后添加另一个 dotnet restore。看看这是否有帮助。

如果没有帮助,请尝试跟踪在 publish 期间安装了哪些包。也许第 5/13 步(COPY . .)覆盖了 dotnet add package 创建的条目,而 publish 中的 restore 只是带回了那些东西添加包 已删除。

关于c# - 如何在 Dockerfile 中正确缓存 C# dotnet 核心包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50921191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com