|
4 | 4 | *--------------------------------------------------------------------------------------------*/ |
5 | 5 |
|
6 | 6 | import { ContainerError } from '../spec-common/errors'; |
| 7 | +import { PlatformInfo } from '../spec-common/commonUtils'; |
7 | 8 | import { LifecycleCommand, LifecycleHooksInstallMap } from '../spec-common/injectHeadless'; |
8 | 9 | import { DevContainerConfig, DevContainerConfigCommand, DevContainerFromDockerComposeConfig, DevContainerFromDockerfileConfig, DevContainerFromImageConfig, getDockerComposeFilePaths, getDockerfilePath, HostGPURequirements, HostRequirements, isDockerFileConfig, PortAttributes, UserEnvProbe } from '../spec-configuration/configuration'; |
9 | 10 | import { Feature, FeaturesConfig, Mount, parseMount, SchemaFeatureLifecycleHooks } from '../spec-configuration/containerFeaturesConfiguration'; |
@@ -349,7 +350,7 @@ export async function getImageBuildInfo(params: DockerResolverParameters | Docke |
349 | 350 | const cwdEnvFile = cliHost.path.join(cliHost.cwd, '.env'); |
350 | 351 | const envFile = Array.isArray(config.dockerComposeFile) && config.dockerComposeFile.length === 0 && await cliHost.isFile(cwdEnvFile) ? cwdEnvFile : undefined; |
351 | 352 | const composeFiles = await getDockerComposeFilePaths(cliHost, config, cliHost.env, cliHost.cwd); |
352 | | - const buildParams: DockerCLIParameters = { cliHost, dockerCLI, dockerComposeCLI, env: cliHost.env, output, platformInfo: params.platformInfo }; |
| 353 | + const buildParams: DockerCLIParameters = { cliHost, dockerCLI, dockerComposeCLI, env: cliHost.env, output, buildPlatformInfo: params.buildPlatformInfo, targetPlatformInfo: params.targetPlatformInfo }; |
353 | 354 |
|
354 | 355 | const composeConfig = await readDockerComposeConfig(buildParams, composeFiles, envFile); |
355 | 356 | const services = Object.keys(composeConfig.services || {}); |
@@ -394,18 +395,40 @@ export async function getImageBuildInfoFromImage(params: DockerResolverParameter |
394 | 395 | export async function getImageBuildInfoFromDockerfile(params: DockerResolverParameters | DockerCLIParameters, dockerfile: string, dockerBuildArgs: Record<string, string>, targetStage: string | undefined, substitute: SubstituteConfig) { |
395 | 396 | const { output } = 'output' in params ? params : params.common; |
396 | 397 | const omitSyntaxDirective = 'common' in params ? !!params.common.omitSyntaxDirective : false; |
397 | | - return internalGetImageBuildInfoFromDockerfile(imageName => inspectDockerImage(params, imageName, true), dockerfile, dockerBuildArgs, targetStage, substitute, output, omitSyntaxDirective); |
| 398 | + return internalGetImageBuildInfoFromDockerfile(imageName => inspectDockerImage(params, imageName, true), dockerfile, dockerBuildArgs, targetStage, substitute, output, omitSyntaxDirective, params.buildPlatformInfo, params.targetPlatformInfo); |
398 | 399 | } |
399 | 400 |
|
400 | | -export async function internalGetImageBuildInfoFromDockerfile(inspectDockerImage: (imageName: string) => Promise<ImageDetails>, dockerfileText: string, dockerBuildArgs: Record<string, string>, targetStage: string | undefined, substitute: SubstituteConfig, output: Log, omitSyntaxDirective: boolean): Promise<ImageBuildInfo> { |
| 401 | +export async function internalGetImageBuildInfoFromDockerfile(inspectDockerImage: (imageName: string) => Promise<ImageDetails>, dockerfileText: string, dockerBuildArgs: Record<string, string>, targetStage: string | undefined, substitute: SubstituteConfig, output: Log, omitSyntaxDirective: boolean, buildPlatform: PlatformInfo, targetPlatform: PlatformInfo): Promise<ImageBuildInfo> { |
401 | 402 | const dockerfile = extractDockerfile(dockerfileText); |
402 | 403 | if (dockerfile.preamble.directives.syntax && omitSyntaxDirective) { |
403 | 404 | output.write(`Omitting syntax directive '${dockerfile.preamble.directives.syntax}' from Dockerfile.`, LogLevel.Trace); |
404 | 405 | delete dockerfile.preamble.directives.syntax; |
405 | 406 | } |
406 | | - const baseImage = findBaseImage(dockerfile, dockerBuildArgs, targetStage); |
| 407 | + // https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/reference.md#automatic-platform-args-in-the-global-scope |
| 408 | + const globalBuildxPlatformArgs = { |
| 409 | + // platform of the node performing the build. |
| 410 | + BUILDPLATFORM: [buildPlatform.os, buildPlatform.arch, buildPlatform.variant].filter(Boolean).join("/"), |
| 411 | + // OS component of BUILDPLATFORM |
| 412 | + BUILDOS: buildPlatform.os, |
| 413 | + // architecture component of BUILDPLATFORM |
| 414 | + BUILDARCH: buildPlatform.arch, |
| 415 | + // variant component of BUILDPLATFORM |
| 416 | + BUILDVARIANT: buildPlatform.variant ?? "", |
| 417 | + // platform of the build result. Eg linux/amd64, linux/arm/v7, windows/amd64. |
| 418 | + TARGETPLATFORM: [targetPlatform.os, targetPlatform.arch, targetPlatform.variant].filter(Boolean).join("/"), |
| 419 | + // OS component of TARGETPLATFORM |
| 420 | + TARGETOS: targetPlatform.os, |
| 421 | + // architecture component of TARGETPLATFORM |
| 422 | + TARGETARCH: targetPlatform.arch, |
| 423 | + // variant component of TARGETPLATFORM |
| 424 | + TARGETVARIANT: targetPlatform.variant ?? "", |
| 425 | + }; |
| 426 | + const baseImage = findBaseImage(dockerfile, dockerBuildArgs, targetStage, globalBuildxPlatformArgs); |
407 | 427 | const imageDetails = baseImage && await inspectDockerImage(baseImage) || undefined; |
408 | | - const dockerfileUser = findUserStatement(dockerfile, dockerBuildArgs, envListToObj(imageDetails?.Config.Env), targetStage); |
| 428 | + const dockerfileUser = findUserStatement(dockerfile, dockerBuildArgs, { |
| 429 | + ...envListToObj(imageDetails?.Config.Env), |
| 430 | + ...globalBuildxPlatformArgs, |
| 431 | + }, targetStage); |
409 | 432 | const user = dockerfileUser || imageDetails?.Config.User || 'root'; |
410 | 433 | const metadata = imageDetails ? getImageMetadata(imageDetails, substitute, output) : { config: [], raw: [], substitute }; |
411 | 434 | return { |
|
0 commit comments