devcontainers / devcontainers/cli

Build context for a Dev Container Feature is invalidated on every build

Ouverte
#1,262 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
TypeScript
Étoiles
3k
Forks
457
Merge moyen
13 h 17 min
PR mergées (30 j)
6

Description

# Current behavior

The build context for a Dev Container Feature is invalidated on every build, even when there are no changes to the `Containerfile`, `devcontainer.json`, or any files included in the build context.

As a result, the feature installation layer is rebuilt every time instead of reusing the existing cache.

# Expected behavior

The Dev Container Feature layer should reuse the build cache whenever possible and only be rebuilt when relevant inputs have changed.

# Environment

| Component | Version |
|-----------|---------|
| OS | Ubuntu 24.04 (Kernel 6.8.0-134-generic) |
| Arch | x86_64 |
| Container runtime | Podman 4.9.3 |
| VS Code | 1.112.0 |
| Dev Container CLI | 0.87.0 |

# Steps to reproduce

```shell
cd /tmp
git clone https://github.com/devcontainers/feature-starter.git
cd feature-starter
```

Remove the `docker-in-docker` feature and add the following feature to `devcontainer.json`:

```json
"ghcr.io/devcontainers/feature-starter/color:1": {
"favorite": "green"
}
```

Build the dev container:

```shell
devcontainer build --docker-path=/usr/bin/podman
```

Build it again without making any changes:

```shell
devcontainer build --docker-path=/usr/bin/podman
```

Notice that the layer responsible for installing the feature is rebuilt instead of being restored from cache:

```text
[2/2] STEP 5/9: RUN echo "_CONTAINER_USER_HOME=$( (command -v getent >/dev/null 2>&1 && getent passwd 'root' || grep -E '^root|^[^:]*:[^:]*:root:' /etc/passwd || true) | cut -d: -f6)" >> /tmp/dev-container-features/devcontainer-features.builtin.env && echo "_REMOTE_USER_HOME=$( (command -v getent >/dev/null 2>&1 && getent passwd 'node' || grep -E '^node|^[^:]*:[^:]*:node:' /etc/passwd || true) | cut -d: -f6)" >> /tmp/dev-container-features/devcontainer-features.builtin.env
--> Using cache c466b018334665827c5d83c2c00f910ce7f80e4bff6b0eb508ac254590faffba
--> c466b0183346

[2/2] STEP 6/9: RUN --mount=type=bind,from=dev_containers_feature_content_source,source=color_0,target=/tmp/build-features-src/color_0 \
cp -ar /tmp/build-features-src/color_0 /tmp/dev-container-features \
&& chmod -R 0755 /tmp/dev-container-features/color_0 \
&& cd /tmp/dev-container-features/color_0 \
&& chmod +x ./devcontainer-features-install.sh \
&& ./devcontainer-features-install.sh \
&& rm -rf /tmp/dev-container-features/color_0

===========================================================================
Feature : My Favorite Color
Description : A feature to remind you of your favorite color
Id : ghcr.io/devcontainers/feature-starter/color
Version : 1.0.3
Options :
FAVORITE="green"
===========================================================================

Activating feature 'color'
The provided favorite color is: green
...
...
```

# Additional observations

I am not sure exactly how feature tarballs are fetched and unpacked internally, but it appears that the feature tarball is downloaded on every invocation and extracted into a versioned directory under `/tmp` whose name changes each run.

For example:

```shell
$ ls -lh /tmp/devcontainercli-foo/container-features
total 52K
drwxrwxr-x 4 mv mv 4.0K Jul 6 19:15 0.87.0-1783358140200
drwxrwxr-x 4 mv mv 4.0K Jul 6 19:16 0.87.0-1783358186697
drwxrwxr-x 4 mv mv 4.0K Jul 6 19:17 0.87.0-1783358228464
```

This changing directory name is most likely to be contributing to cache invalidation.

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Start with the feature-starter reproduction, its devcontainer.json, and the `devcontainer build --docker-path=/usr/bin/podman` entry point. Compare repeated builds and inspect the feature tarball directories under `/tmp/devcontainercli-foo/container-features`; done means an unchanged build reuses the feature installation layer while relevant input changes still invalidate it.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
build-system, cli
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
64/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.