|
3 | 3 | * Licensed under the MIT License. See License.txt in the project root for license information. |
4 | 4 | *--------------------------------------------------------------------------------------------*/ |
5 | 5 |
|
| 6 | +import { PlatformInfo } from '../spec-common/commonUtils'; |
6 | 7 | import { ContainerError } from '../spec-common/errors'; |
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'; |
@@ -394,16 +395,20 @@ 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.platformInfo); |
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, platformInfo: 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 | + const baseImage = findBaseImage(dockerfile, dockerBuildArgs, targetStage, platformInfo); |
| 408 | + const dummyBaseImage = findBaseImage(dockerfile, dockerBuildArgs, targetStage, { os: 'unknown', arch: 'unknown' }); |
| 409 | + if (baseImage !== dummyBaseImage) { |
| 410 | + throw new Error(`Inconsistent base image used for multi-platform builds. Please check your Dockerfile.`); |
| 411 | + } |
407 | 412 | const imageDetails = baseImage && await inspectDockerImage(baseImage) || undefined; |
408 | 413 | const dockerfileUser = findUserStatement(dockerfile, dockerBuildArgs, envListToObj(imageDetails?.Config.Env), targetStage); |
409 | 414 | const user = dockerfileUser || imageDetails?.Config.User || 'root'; |
|
0 commit comments