From c35883bb0ae0ca8bca9852b6757e30760460a33a Mon Sep 17 00:00:00 2001 From: Pablo Ulloa Date: Mon, 22 Apr 2024 05:00:39 +0000 Subject: [PATCH] Caching user home location before every feature is installed --- .../containerFeaturesConfiguration.ts | 11 ++++++++++- .../container-features/generateFeaturesConfig.test.ts | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/spec-configuration/containerFeaturesConfiguration.ts b/src/spec-configuration/containerFeaturesConfiguration.ts index 8b5968f3..50a645aa 100644 --- a/src/spec-configuration/containerFeaturesConfiguration.ts +++ b/src/spec-configuration/containerFeaturesConfiguration.ts @@ -293,15 +293,21 @@ export function getFeatureLayers(featuresConfig: FeaturesConfig, containerUser: const useSELinuxLabel = process.platform === 'linux' && isBuildah; const builtinsEnvFile = `${path.posix.join(FEATURES_CONTAINER_TEMP_DEST_FOLDER, 'devcontainer-features.builtin.env')}`; - let result = `RUN \\ + const tempUserHome = `RUN \\ echo "_CONTAINER_USER_HOME=$(${getEntPasswdShellCommand(containerUser)} | cut -d: -f6)" >> ${builtinsEnvFile} && \\ echo "_REMOTE_USER_HOME=$(${getEntPasswdShellCommand(remoteUser)} | cut -d: -f6)" >> ${builtinsEnvFile} `; + // placeholder empty string to concatenate the feature layers + let result = ''; + // Features version 1 const folders = (featuresConfig.featureSets || []).filter(y => y.internalVersion !== '2').map(x => x.features[0].consecutiveId); folders.forEach(folder => { + // calculate container user home and remote user home before feature installation + result += tempUserHome; + const source = path.posix.join(contentSourceRootPath, folder!); const dest = path.posix.join(FEATURES_CONTAINER_TEMP_DEST_FOLDER, folder!); if (!useBuildKitBuildContexts) { @@ -327,6 +333,9 @@ RUN chmod -R 0755 ${dest} \\ // Features version 2 featuresConfig.featureSets.filter(y => y.internalVersion === '2').forEach(featureSet => { featureSet.features.forEach(feature => { + // recalculate container user home and remote user home if feature modifies it + result += tempUserHome; + result += generateContainerEnvs(feature.containerEnv); const source = path.posix.join(contentSourceRootPath, feature.consecutiveId!); const dest = path.posix.join(FEATURES_CONTAINER_TEMP_DEST_FOLDER, feature.consecutiveId!); diff --git a/src/test/container-features/generateFeaturesConfig.test.ts b/src/test/container-features/generateFeaturesConfig.test.ts index 32647a71..bbfa7e80 100644 --- a/src/test/container-features/generateFeaturesConfig.test.ts +++ b/src/test/container-features/generateFeaturesConfig.test.ts @@ -76,6 +76,10 @@ RUN chmod -R 0755 /tmp/dev-container-features/color_0 \\ && chmod +x ./devcontainer-features-install.sh \\ && ./devcontainer-features-install.sh +RUN \\ +echo "_CONTAINER_USER_HOME=$(${getEntPasswdShellCommand('testContainerUser')} | cut -d: -f6)" >> /tmp/dev-container-features/devcontainer-features.builtin.env && \\ +echo "_REMOTE_USER_HOME=$(${getEntPasswdShellCommand('testRemoteUser')} | cut -d: -f6)" >> /tmp/dev-container-features/devcontainer-features.builtin.env + COPY --chown=root:root --from=dev_containers_feature_content_source /tmp/build-features/hello_1 /tmp/dev-container-features/hello_1 RUN chmod -R 0755 /tmp/dev-container-features/hello_1 \\