gpt4 book ai didi

Docker 缓存失效

转载 作者:行者123 更新时间:2023-12-04 12:03:35 25 4
gpt4 key购买 nike

我的自定义 Dockerfile 遇到了一些奇怪的问题,在 alpine 容器中编译了一个 .Net 核心应用程序。

我尝试了许多不同的配置都无济于事 - 当我实现最终的 FROM 时,缓存总是无效的。指令(如果我评论它和它下面的所有内容,缓存工作正常)。这是文件:

FROM microsoft/dotnet:2.1-sdk-alpine3.7 AS build
ARG ASPNETCORE_ENVIRONMENT=development
ARG ASPNET_CONFIGURATION=Debug
ARG PROJECT_DIR=src/API/
ARG PROJECT_NAME=MyAPI
ARG SOLUTION_NAME=MySolution

RUN export

WORKDIR /source

COPY ./*.sln ./nuget.config ./

# Copy source project files
COPY src/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done

# # Copy test project files
COPY test/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p test/${file%.*}/ && mv $file test/${file%.*}/; done

RUN dotnet restore

COPY . ./

RUN for dir in test/*.Tests/; do (cd "$dir" && dotnet test --filter TestType!=Integration); done

WORKDIR /source/${PROJECT_DIR}

RUN dotnet build ${PROJECT_NAME}.csproj -c $ASPNET_CONFIGURATION -o /app

RUN dotnet publish ${PROJECT_NAME}.csproj -c $ASPNET_CONFIGURATION -o /app --no-restore

FROM microsoft/dotnet:2.1-aspnetcore-runtime-alpine3.7
ARG ASPNETCORE_ENVIRONMENT=development

RUN export

COPY --from=build /app .

WORKDIR /app
EXPOSE 80
VOLUME /app/logs

ENTRYPOINT ["dotnet", "MyAssembly.dll"]

有任何想法吗?提示?提示?非常明显的错误?我检查了每一层和 COPY . ./指令仅复制我希望它复制的文件 - 在构建之间它们都不会改变。

还值得注意的是,如果我删除最后一条 FROM 指令(和其他相关行),缓存可以完美运行 - 但最终图像大小显然比基础 microsoft/dotnet:2.1-aspnetcore-runtime-alpine3.7 大得多。 (172Mb 对 1.8Gb)图像。我试过只是注释掉 COPY FROM 之后的指令,但不影响缓存失效。以下按预期工作:
FROM microsoft/dotnet:2.1-sdk-alpine3.7 AS build
ARG ASPNETCORE_ENVIRONMENT=development
ARG ASPNET_CONFIGURATION=Debug
ARG PROJECT_DIR=src/API/
ARG PROJECT_NAME=MyAPI
ARG SOLUTION_NAME=MySolution

RUN export

WORKDIR /source

COPY ./*.sln ./nuget.config ./

# Copy source project files
COPY src/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p src/${file%.*}/ && mv $file src/${file%.*}/; done

# # Copy test project files
COPY test/*/*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p test/${file%.*}/ && mv $file test/${file%.*}/; done

RUN dotnet restore

COPY . ./

RUN for dir in test/*.Tests/; do (cd "$dir" && dotnet test --filter TestType!=Integration); done

WORKDIR /source/${PROJECT_DIR}

RUN dotnet build ${PROJECT_NAME}.csproj -c $ASPNET_CONFIGURATION -o /app

RUN dotnet publish ${PROJECT_NAME}.csproj -c $ASPNET_CONFIGURATION -o /app --no-restore

WORKDIR /app
EXPOSE 80
VOLUME /app/logs

ENTRYPOINT ["dotnet", "MyAssembly.dll"]

.dockerignore 如下:
base-images/
docker-compose.yml
docker-compose.*.yml
VERSION

**/.*
**/*.ps1
**/*.DotSettings
**/*.csproj.user
**/*.md
**/*.log
**/*.sh
**/Dockerfile
**/bin
**/obj
**/node_modules
**/.vs
**/.vscode
**/dist
**/packages/
**/wwwroot/

最后一点信息:我正在使用 docker-compose 构建容器 - 特别是通过运行 docker-compose build myservicename ,但使用 docker build -f src/MyAssembly/Dockerfile -t MyImageName . 构建图像产生相同的结果。

最佳答案

如果您在本地构建并且缓存不起作用 – 那么我不知道问题是什么:)
但是,如果您将构建作为 CI 的一部分,那么问题可能是您需要明确地拉取、构建和推送中间阶段:

> docker pull MyImageName:build || true
> docker pull MyImageName:latest || true
> docker build --target build --tag MyImageName:build .
> docker build --cache-from MyImageName:build --tag MyImageName:latest .
> docker push MyImageName:build
> docker push MyImageName:latest
|| true部分在那里是因为图像不会在初始 CI 构建中出现。这个食谱的“魔法酱”是 docker build --target <intermediate-stage-name>docker build --cache-from <intermediate-stage-name> .
我无法解释为什么需要明确地构建和推送中间阶段才能使缓存工作 - 除了一些关于仅推送最终图像而不是中间阶段及其层的问题。但它对我有用——我从这里学到了这个“技巧”: https://pythonspeed.com/articles/faster-multi-stage-builds/

关于Docker 缓存失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51439321/

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