@@ -11,7 +11,7 @@ import { LogLevel, makeLog } from '../spec-utils/log';
1111import { FeaturesConfig , getContainerFeaturesBaseDockerFile , getFeatureInstallWrapperScript , getFeatureLayers , getFeatureMainValue , getFeatureValueObject , generateFeaturesConfig , Feature , generateContainerEnvs } from '../spec-configuration/containerFeaturesConfiguration' ;
1212import { readLocalFile } from '../spec-utils/pfs' ;
1313import { includeAllConfiguredFeatures } from '../spec-utils/product' ;
14- import { createFeaturesTempFolder , DockerResolverParameters , getCacheFolder , getFolderImageName , getEmptyContextFolder , SubstitutedConfig } from './utils' ;
14+ import { createFeaturesTempFolder , DockerResolverParameters , getCacheFolder , getFolderImageName , getEmptyContextFolder , SubstitutedConfig , ensureDockerHubImageAccessible } from './utils' ;
1515import { isEarlierVersion , parseVersion , runCommandNoPty } from '../spec-common/commonUtils' ;
1616import { getDevcontainerMetadata , getDevcontainerMetadataLabel , getImageBuildInfoFromImage , ImageBuildInfo , ImageMetadataEntry , imageMetadataLabel , MergedDevContainerConfig } from './imageMetadata' ;
1717import { supportsBuildContexts } from './dockerfileUtils' ;
@@ -154,7 +154,7 @@ export async function getExtendImageBuildInfo(params: DockerResolverParameters,
154154 }
155155 } ;
156156 }
157- return { featureBuildInfo : getImageBuildOptions ( params , config , dstFolder , baseName , imageBuildInfo ) } ;
157+ return { featureBuildInfo : await getImageBuildOptions ( params , config , dstFolder , baseName , imageBuildInfo ) } ;
158158 }
159159
160160 // Generates the end configuration.
@@ -193,24 +193,25 @@ export interface ImageBuildOptions {
193193 securityOpts : string [ ] ;
194194}
195195
196- function getImageBuildOptions ( params : DockerResolverParameters , config : SubstitutedConfig < DevContainerConfig > , dstFolder : string , baseName : string , imageBuildInfo : ImageBuildInfo ) : ImageBuildOptions {
197- const syntax = imageBuildInfo . dockerfile ?. preamble . directives . syntax ;
198- return {
199- dstFolder,
200- dockerfileContent : `
196+ async function getImageBuildOptions ( params : DockerResolverParameters , config : SubstitutedConfig < DevContainerConfig > , dstFolder : string , baseName : string , imageBuildInfo : ImageBuildInfo ) : Promise < ImageBuildOptions > {
197+ const syntax = imageBuildInfo . dockerfile ?. preamble . directives . syntax ;
198+ const dockerHubAccessible = syntax ? await ensureDockerHubImageAccessible ( params , 'docker/dockerfile' , '1.4' ) : false ;
199+ return {
200+ dstFolder,
201+ dockerfileContent : `
201202FROM $_DEV_CONTAINERS_BASE_IMAGE AS dev_containers_target_stage
202203${ getDevcontainerMetadataLabel ( getDevcontainerMetadata ( imageBuildInfo . metadata , config , { featureSets : [ ] } , [ ] , getOmitDevcontainerPropertyOverride ( params . common ) ) ) }
203204` ,
204- overrideTarget : 'dev_containers_target_stage' ,
205- dockerfilePrefixContent : `${ syntax ? `# syntax=${ syntax } ` : '' }
206- ARG _DEV_CONTAINERS_BASE_IMAGE=placeholder
205+ overrideTarget : 'dev_containers_target_stage' ,
206+ dockerfilePrefixContent : `${ dockerHubAccessible && syntax ? `# syntax=${ syntax } ` : '' }
207+ ARG _DEV_CONTAINERS_BASE_IMAGE=placeholder
207208` ,
208- buildArgs : {
209- _DEV_CONTAINERS_BASE_IMAGE : baseName ,
210- } as Record < string , string > ,
211- buildKitContexts : { } as Record < string , string > ,
212- securityOpts : [ ] ,
213- } ;
209+ buildArgs : {
210+ _DEV_CONTAINERS_BASE_IMAGE : baseName ,
211+ } as Record < string , string > ,
212+ buildKitContexts : { } as Record < string , string > ,
213+ securityOpts : [ ] ,
214+ } ;
214215}
215216
216217function getOmitDevcontainerPropertyOverride ( resolverParams : { omitConfigRemotEnvFromMetadata ?: boolean } ) : ( keyof DevContainerConfig & keyof ImageMetadataEntry ) [ ] {
@@ -262,11 +263,12 @@ async function getFeaturesBuildOptions(params: DockerResolverParameters, devCont
262263 . replace ( '#{devcontainerMetadata}' , getDevcontainerMetadataLabel ( imageMetadata ) )
263264 . replace ( '#{containerEnvMetadata}' , generateContainerEnvs ( devContainerConfig . config . containerEnv , true ) )
264265 ;
265- const syntax = imageBuildInfo . dockerfile ?. preamble . directives . syntax ;
266- const omitSyntaxDirective = common . omitSyntaxDirective ; // Can be removed when https://github.com/moby/buildkit/issues/4556 is fixed
267- const dockerfilePrefixContent = `${ omitSyntaxDirective ? '' :
268- useBuildKitBuildContexts && ! ( imageBuildInfo . dockerfile && supportsBuildContexts ( imageBuildInfo . dockerfile ) ) ? '# syntax=docker/dockerfile:1.4' :
269- syntax ? `# syntax=${ syntax } ` : '' }
266+ const syntax = imageBuildInfo . dockerfile ?. preamble . directives . syntax ;
267+ const omitSyntaxDirective = common . omitSyntaxDirective ; // Can be removed when https://github.com/moby/buildkit/issues/4556 is fixed
268+ const dockerHubAccessible = ! omitSyntaxDirective ? await ensureDockerHubImageAccessible ( params , 'docker/dockerfile' , '1.4' ) : false ;
269+ const dockerfilePrefixContent = `${ omitSyntaxDirective ? '' :
270+ useBuildKitBuildContexts && dockerHubAccessible && ! ( imageBuildInfo . dockerfile && supportsBuildContexts ( imageBuildInfo . dockerfile ) ) ? '# syntax=docker/dockerfile:1.4' :
271+ syntax ? `# syntax=${ syntax } ` : '' }
270272ARG _DEV_CONTAINERS_BASE_IMAGE=placeholder
271273` ;
272274
0 commit comments