Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/spec-common/cliHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import * as path from 'path';
import * as net from 'net';
import * as os from 'os';

import { readLocalFile, writeLocalFile, mkdirpLocal, isLocalFile, renameLocal, readLocalDir, isLocalFolder } from '../spec-utils/pfs';
import { readLocalFile, writeLocalFile, mkdirpLocal, isLocalFile, renameLocal, readLocalDir, isLocalFolder, unlinkLocal } from '../spec-utils/pfs';
import { URI } from 'vscode-uri';
import { ExecFunction, getLocalUsername, plainExec, plainPtyExec, PtyExecFunction } from './commonUtils';
import { Abort, Duplex, Sink, Source, SourceCallback } from 'pull-stream';
Expand All @@ -32,6 +32,7 @@ export interface CLIHost {
isFolder(filepath: string): Promise<boolean>;
readFile(filepath: string): Promise<Buffer>;
writeFile(filepath: string, content: Buffer): Promise<void>;
deleteFile?(filepath: string): Promise<void>;
rename(oldPath: string, newPath: string): Promise<void>;
mkdirp(dirpath: string): Promise<void>;
readDir(dirpath: string): Promise<string[]>;
Expand Down Expand Up @@ -76,6 +77,7 @@ function createLocalCLIHostFromExecFunctions(localCwd: string, exec: ExecFunctio
isFolder: isLocalFolder,
readFile: readLocalFile,
writeFile: writeLocalFile,
deleteFile: unlinkLocal,
rename: renameLocal,
mkdirp: async (dirpath) => {
await mkdirpLocal(dirpath);
Expand Down
23 changes: 21 additions & 2 deletions src/spec-node/dockerCompose.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { Mount, parseMount } from '../spec-configuration/containerFeaturesConfig
import path from 'path';
import { getDevcontainerMetadata, getImageBuildInfoFromDockerfile, getImageBuildInfoFromImage, getImageMetadataFromContainer, ImageBuildInfo, lifecycleCommandOriginMapFromMetadata, mergeConfiguration, MergedDevContainerConfig } from './imageMetadata';
import { ensureDockerfileHasFinalStageName } from './dockerfileUtils';
import { materializeResolvedDockerfileForBuild, resolveDockerfileIncludesIfNeeded } from './dockerfilePreprocess';
import { randomUUID } from 'crypto';

const projectLabel = 'com.docker.compose.project';
Expand Down Expand Up @@ -163,11 +164,16 @@ export async function buildAndExtendDockerCompose(configWithRaw: SubstitutedConf
let baseName = 'dev_container_auto_added_stage_label';
let dockerfile: string | undefined;
let imageBuildInfo: ImageBuildInfo;
let preprocessedDockerfilePathForComposeBuild: string | undefined;
let disposeMaterializedDockerfile = async () => { };
let resolvedBuildDockerfile;
const serviceInfo = getBuildInfoForService(composeService, cliHost.path, localComposeFiles);
if (serviceInfo.build) {
const { context, dockerfilePath, target } = serviceInfo.build;
const resolvedDockerfilePath = cliHost.path.isAbsolute(dockerfilePath) ? dockerfilePath : path.resolve(context, dockerfilePath);
const originalDockerfile = (await cliHost.readFile(resolvedDockerfilePath)).toString();
const resolvedDockerfile = await resolveDockerfileIncludesIfNeeded(cliHost, resolvedDockerfilePath);
resolvedBuildDockerfile = resolvedDockerfile;
const originalDockerfile = resolvedDockerfile.effectiveDockerfileContent;
dockerfile = originalDockerfile;
if (target) {
// Explictly set build target for the dev container build features on that
Expand All @@ -191,9 +197,18 @@ export async function buildAndExtendDockerCompose(configWithRaw: SubstitutedConf
const supportsAdditionalBuildContexts = !params.isPodman && version && !isEarlierVersion(version, [2, 17, 0]);
const optionalBuildKitParams = supportsAdditionalBuildContexts ? params : { ...params, buildKitVersion: undefined };
const extendImageBuildInfo = await getExtendImageBuildInfo(optionalBuildKitParams, configWithRaw, baseName, imageBuildInfo, composeService.user, additionalFeatures, canAddLabelsToContainer);
if (resolvedBuildDockerfile && !extendImageBuildInfo?.featureBuildInfo) {
const materializedDockerfile = await materializeResolvedDockerfileForBuild(cliHost, resolvedBuildDockerfile);
preprocessedDockerfilePathForComposeBuild = materializedDockerfile.dockerfilePath;
disposeMaterializedDockerfile = materializedDockerfile.dispose;
}

let overrideImageName: string | undefined;
let buildOverrideContent = '';
if (preprocessedDockerfilePathForComposeBuild && !extendImageBuildInfo?.featureBuildInfo) {
buildOverrideContent += ' build:\n';
buildOverrideContent += ` dockerfile: ${preprocessedDockerfilePathForComposeBuild}\n`;
}
if (extendImageBuildInfo?.featureBuildInfo) {
// Avoid retagging a previously pulled image.
if (!serviceInfo.build) {
Expand Down Expand Up @@ -264,7 +279,8 @@ ${cacheFromOverrideContent}
args.push('-f', composeOverrideFile);
}

if (!noBuild) {
try {
if (!noBuild) {
args.push('build');
if (noCache) {
args.push('--no-cache');
Expand Down Expand Up @@ -294,6 +310,9 @@ ${cacheFromOverrideContent}

throw err instanceof ContainerError ? err : new ContainerError({ description: 'An error occurred building the Docker Compose images.', originalError: err, data: { fileWithError: localComposeFiles[0] } });
}
}
} finally {
await disposeMaterializedDockerfile();
}

return {
Expand Down
Loading
Loading