From 6af80549fc6270d8f3bcf7c137aa51333b4b61c2 Mon Sep 17 00:00:00 2001 From: "Meszaros, Gergely" Date: Fri, 13 Jun 2025 08:55:33 +0000 Subject: [PATCH] Support lifecycle hooks in devcontainer features Parse and save lifecycle hooks from features into image metadata. Once available as metadata, it seems like they are correctly used already. Tests are missing, I do not have the capacity to add them. Would appreciate maintainer help with that. Fixes: #1880 --- pkg/devcontainer/config/feature.go | 3 +-- pkg/devcontainer/metadata/metadata.go | 7 ++++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/devcontainer/config/feature.go b/pkg/devcontainer/config/feature.go index 55d0fd9e8..334ee31fe 100644 --- a/pkg/devcontainer/config/feature.go +++ b/pkg/devcontainer/config/feature.go @@ -61,8 +61,7 @@ type FeatureConfig struct { // Container environment variables. ContainerEnv map[string]string `json:"containerEnv,omitempty"` - // Tool-specific configuration. Each tool should use a JSON object subproperty with a unique name to group its customizations. - Customizations map[string]interface{} `json:"customizations,omitempty"` + DevContainerActions `json:",inline"` // Origin is the path where the feature was loaded from Origin string `json:"-"` diff --git a/pkg/devcontainer/metadata/metadata.go b/pkg/devcontainer/metadata/metadata.go index 2aa59e731..afb4d6049 100644 --- a/pkg/devcontainer/metadata/metadata.go +++ b/pkg/devcontainer/metadata/metadata.go @@ -39,7 +39,12 @@ func FeatureConfigToImageMetadata(feature *config.FeatureConfig) *config.ImageMe return &config.ImageMetadata{ Entrypoint: feature.Entrypoint, DevContainerActions: config.DevContainerActions{ - Customizations: feature.Customizations, + OnCreateCommand: feature.OnCreateCommand, + UpdateContentCommand: feature.UpdateContentCommand, + PostCreateCommand: feature.PostCreateCommand, + PostStartCommand: feature.PostStartCommand, + PostAttachCommand: feature.PostAttachCommand, + Customizations: feature.Customizations, }, NonComposeBase: config.NonComposeBase{ Mounts: feature.Mounts,