@@ -11,20 +11,11 @@ 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 , retry } from './utils' ;
14+ import { createFeaturesTempFolder , DockerResolverParameters , getCacheFolder , getFolderImageName , getEmptyContextFolder , SubstitutedConfig , ensureDockerfileFrontendAccessible } from './utils' ;
1515import { isEarlierVersion , parseVersion , runCommandNoPty } from '../spec-common/commonUtils' ;
1616import { getDevcontainerMetadata , getDevcontainerMetadataLabel , getImageBuildInfoFromImage , ImageBuildInfo , ImageMetadataEntry , imageMetadataLabel , MergedDevContainerConfig } from './imageMetadata' ;
1717import { supportsBuildContexts } from './dockerfileUtils' ;
1818import { ContainerError } from '../spec-common/errors' ;
19- import { requestResolveHeaders } from '../spec-utils/httpRequest' ;
20-
21- // Constants for DockerHub registry + Dockerfile v1.4 image access check
22- const DOCKERHUB_AUTH_URL = 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:docker/dockerfile:pull&tag=1.4' ;
23- const DOCKERHUB_REGISTRY_URL = 'https://registry-1.docker.io/v2/docker/dockerfile/manifests/1.4' ;
24- const DEVCONTAINER_USER_AGENT = 'devcontainer' ;
25- const DOCKER_MANIFEST_ACCEPT_HEADER = 'application/vnd.docker.distribution.manifest.v2+json' ;
26- const DOCKERFILE_FRONTEND_CHECK_MAX_RETRIES = 5 ;
27- const DOCKERFILE_FRONTEND_CHECK_RETRY_INTERVAL_MS = 2000 ;
2819
2920// Escapes environment variable keys.
3021//
@@ -204,7 +195,7 @@ export interface ImageBuildOptions {
204195
205196async function getImageBuildOptions ( params : DockerResolverParameters , config : SubstitutedConfig < DevContainerConfig > , dstFolder : string , baseName : string , imageBuildInfo : ImageBuildInfo ) : Promise < ImageBuildOptions > {
206197 const syntax = imageBuildInfo . dockerfile ?. preamble . directives . syntax ;
207- const dockerHubAccessible = syntax ? await ensureDockerfileFrontendAccessible ( params ) : false ;
198+ const dockerHubAccessible = syntax ? await ensureDockerfileFrontendAccessible ( params , 'docker/dockerfile' , '1.4' ) : false ;
208199 return {
209200 dstFolder,
210201 dockerfileContent : `
@@ -231,62 +222,6 @@ function getOmitDevcontainerPropertyOverride(resolverParams: { omitConfigRemotEn
231222 return [ ] ;
232223}
233224
234- async function checkDockerfileFrontendAccessible ( params : DockerResolverParameters ) : Promise < void > {
235- const { output } = params . common ;
236-
237- const tokenRes = await requestResolveHeaders ( {
238- type : 'GET' ,
239- url : DOCKERHUB_AUTH_URL ,
240- headers : { 'user-agent' : DEVCONTAINER_USER_AGENT }
241- } , output ) ;
242- if ( ! tokenRes || tokenRes . statusCode !== 200 ) {
243- throw new Error ( 'Token fetch failed: status ' + ( tokenRes ?. statusCode ?? 'unknown' ) ) ;
244- }
245-
246- let body : any ;
247- try {
248- body = JSON . parse ( tokenRes . resBody . toString ( ) ) ;
249- } catch ( e ) {
250- throw new Error ( 'Token parse failed: ' + ( e instanceof Error ? e . message : String ( e ) ) ) ;
251- }
252- const token : string | undefined = body ?. token || body ?. access_token ;
253- if ( ! token ) {
254- throw new Error ( 'Token missing in auth response' ) ;
255- }
256-
257- const manifestRes = await requestResolveHeaders ( {
258- type : 'GET' ,
259- url : DOCKERHUB_REGISTRY_URL ,
260- headers : {
261- 'user-agent' : DEVCONTAINER_USER_AGENT ,
262- 'authorization' : `Bearer ${ token } ` ,
263- 'accept' : DOCKER_MANIFEST_ACCEPT_HEADER
264- }
265- } , output ) ;
266- if ( ! manifestRes || manifestRes . statusCode !== 200 ) {
267- throw new Error ( 'Manifest fetch failed: status ' + ( manifestRes ?. statusCode ?? 'unknown' ) ) ;
268- }
269- }
270-
271- async function ensureDockerfileFrontendAccessible ( params : DockerResolverParameters ) : Promise < boolean > {
272- const { output } = params . common ;
273- try {
274- await retry (
275- async ( ) => { await checkDockerfileFrontendAccessible ( params ) ; } ,
276- { maxRetries : DOCKERFILE_FRONTEND_CHECK_MAX_RETRIES , retryIntervalMilliseconds : DOCKERFILE_FRONTEND_CHECK_RETRY_INTERVAL_MS , output }
277- ) ;
278- output . write ( 'Dockerfile frontend is accessible in DockerHub registry.' , LogLevel . Info ) ;
279- return true ;
280- } catch ( err ) {
281- output . write (
282- 'Dockerfile frontend check failed after retries: ' +
283- ( err instanceof Error ? err . message : String ( err ) ) ,
284- LogLevel . Warning
285- ) ;
286- return false ;
287- }
288- }
289-
290225async function getFeaturesBuildOptions ( params : DockerResolverParameters , devContainerConfig : SubstitutedConfig < DevContainerConfig > , featuresConfig : FeaturesConfig , baseName : string , imageBuildInfo : ImageBuildInfo , composeServiceUser : string | undefined ) : Promise < ImageBuildOptions | undefined > {
291226 const { common } = params ;
292227 const { cliHost, output } = common ;
@@ -330,7 +265,7 @@ async function getFeaturesBuildOptions(params: DockerResolverParameters, devCont
330265 ;
331266 const syntax = imageBuildInfo . dockerfile ?. preamble . directives . syntax ;
332267 const omitSyntaxDirective = common . omitSyntaxDirective ; // Can be removed when https://github.com/moby/buildkit/issues/4556 is fixed
333- const dockerHubAccessible = ! omitSyntaxDirective ? await ensureDockerfileFrontendAccessible ( params ) : false ;
268+ const dockerHubAccessible = ! omitSyntaxDirective ? await ensureDockerfileFrontendAccessible ( params , 'docker/dockerfile' , '1.4' ) : false ;
334269 const dockerfilePrefixContent = `${ omitSyntaxDirective ? '' :
335270 useBuildKitBuildContexts && dockerHubAccessible && ! ( imageBuildInfo . dockerfile && supportsBuildContexts ( imageBuildInfo . dockerfile ) ) ? '# syntax=docker/dockerfile:1.4' :
336271 syntax ? `# syntax=${ syntax } ` : '' }
0 commit comments