GoogleContainerTools / GoogleContainerTools/skaffold

Add capability to exclude built intermediate artifacts from load to local cluster

Open
#9,898 0 comments 2 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
15.9k
Forks
1.7k
Avg merge
3d 9h
Merged PRs (30d)
10

Description

I have a project that uses an intermediate artifact. Here's an example:

```Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:8.0-azurelinux3.0 AS build

USER root

COPY . /app

WORKDIR /app

RUN dotnet restore && \
ls /root/.nuget/packages
```

This then gets used as a base image for my actual application Dockerfiles:

```Dockerfile
ARG BUILD_IMAGE
FROM $BUILD_IMAGE AS build

WORKDIR /app/

COPY ./src/MyApp ./src/MyApp

WORKDIR /app/src/MyApp

RUN dotnet publish --no-restore --no-dependencies -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:8.0-azurelinux3.0 AS final

USER app
WORKDIR /app
COPY --from=build /app/src/MyApp/out .

ENTRYPOINT ["dotnet", "MyApp.dll"]
```

And I build it using skaffold:

```yaml
apiVersion: skaffold/v4beta8
kind: Config
metadata:
name: dotnet-restore
build:
local:
push: false
useBuildkit: true
artifacts:
- image: myapp-dotnet-restore
context: .
docker:
dockerfile: ./intermediate-images/dotnet-restore/Dockerfile
---
apiVersion: skaffold/v4beta8
kind: Config
requires:
- configs: [dotnet-restore]
build:
local:
push: false
useBuildkit: true
artifacts:
- image: my-app
context: .
docker:
dockerfile: ./src/MyApp/Dockerfile
requires:
- image: myapp-dotnet-restore
alias: BUILD_IMAGE
```

I'm using this intermediate image because the `dotnet restore` step downloads lots of nuget packages, and I want to minimise the number of times this image gets rebuilt (and maximise the number of times the layer cache can be reused when it does get rebuilt).

The same pattern applies to using intermediate images for dependency caching cross-language - e.g. modules in js, go, python, java, etc.

I've noticed that skaffold tries to load the intermediate image onto my local k8s cluster - because it has push: false. This image contains all the package dependencies for the entire solution, so loading it into the local k8s cluster takes significant time and *isn't necessary* as it isn't used in any actual running containers.

I'd love to be able to mark an artifact as `buildOnly` or `intermediate` or similar, to tell skaffold that this artifact is an intermediate part of the build process and not part of the build output, and so doesn't ever need loaded into the local cluster *or* pushed to a remote repo.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.