@@ -39,6 +39,7 @@ import (
3939	"github.com/opencontainers/go-digest" 
4040	"github.com/opencontainers/image-spec/specs-go" 
4141	v1 "github.com/opencontainers/image-spec/specs-go/v1" 
42+ 	"github.com/sirupsen/logrus" 
4243)
4344
4445func  (s  * composeService ) Publish (ctx  context.Context , project  * types.Project , repository  string , options  api.PublishOptions ) error  {
@@ -65,54 +66,33 @@ func (s *composeService) publish(ctx context.Context, project *types.Project, re
6566		return  err 
6667	}
6768
68- 	named , err  :=  reference . ParseDockerRef ( repository )
69+ 	layers , err  :=  s . createLayers ( ctx ,  project ,  options )
6970	if  err  !=  nil  {
7071		return  err 
7172	}
7273
73- 	config  :=  s .dockerCli .ConfigFile ()
74- 
75- 	resolver  :=  oci .NewResolver (config )
76- 
77- 	var  layers  []v1.Descriptor 
78- 	extFiles  :=  map [string ]string {}
79- 	for  _ , file  :=  range  project .ComposeFiles  {
80- 		data , err  :=  processFile (ctx , file , project , extFiles )
81- 		if  err  !=  nil  {
82- 			return  err 
83- 		}
84- 
85- 		layerDescriptor  :=  oci .DescriptorForComposeFile (file , data )
86- 		layers  =  append (layers , layerDescriptor )
87- 	}
88- 
89- 	extLayers , err  :=  processExtends (ctx , project , extFiles )
90- 	if  err  !=  nil  {
91- 		return  err 
92- 	}
93- 	layers  =  append (layers , extLayers ... )
94- 
95- 	if  options .WithEnvironment  {
96- 		layers  =  append (layers , envFileLayers (project )... )
97- 	}
98- 
99- 	if  options .ResolveImageDigests  {
100- 		yaml , err  :=  s .generateImageDigestsOverride (ctx , project )
101- 		if  err  !=  nil  {
102- 			return  err 
103- 		}
104- 
105- 		layerDescriptor  :=  oci .DescriptorForComposeFile ("image-digests.yaml" , yaml )
106- 		layers  =  append (layers , layerDescriptor )
107- 	}
108- 
10974	w  :=  progress .ContextWriter (ctx )
11075	w .Event (progress.Event {
11176		ID :     repository ,
11277		Text :   "publishing" ,
11378		Status : progress .Working ,
11479	})
80+ 	if  logrus .IsLevelEnabled (logrus .DebugLevel ) {
81+ 		logrus .Debug ("publishing layers" )
82+ 		for  _ , layer  :=  range  layers  {
83+ 			indent , _  :=  json .MarshalIndent (layer , "" , "  " )
84+ 			fmt .Println (string (indent ))
85+ 		}
86+ 	}
11587	if  ! s .dryRun  {
88+ 		named , err  :=  reference .ParseDockerRef (repository )
89+ 		if  err  !=  nil  {
90+ 			return  err 
91+ 		}
92+ 
93+ 		config  :=  s .dockerCli .ConfigFile ()
94+ 		resolver  :=  oci .NewResolver (config )
95+ 
11696		descriptor , err  :=  oci .PushManifest (ctx , resolver , named , layers , options .OCIVersion )
11797		if  err  !=  nil  {
11898			w .Event (progress.Event {
@@ -175,11 +155,47 @@ func (s *composeService) publish(ctx context.Context, project *types.Project, re
175155	return  nil 
176156}
177157
158+ func  (s  * composeService ) createLayers (ctx  context.Context , project  * types.Project , options  api.PublishOptions ) ([]v1.Descriptor , error ) {
159+ 	var  layers  []v1.Descriptor 
160+ 	extFiles  :=  map [string ]string {}
161+ 	envFiles  :=  map [string ]string {}
162+ 	for  _ , file  :=  range  project .ComposeFiles  {
163+ 		data , err  :=  processFile (ctx , file , project , extFiles , envFiles )
164+ 		if  err  !=  nil  {
165+ 			return  nil , err 
166+ 		}
167+ 
168+ 		layerDescriptor  :=  oci .DescriptorForComposeFile (file , data )
169+ 		layers  =  append (layers , layerDescriptor )
170+ 	}
171+ 
172+ 	extLayers , err  :=  processExtends (ctx , project , extFiles )
173+ 	if  err  !=  nil  {
174+ 		return  nil , err 
175+ 	}
176+ 	layers  =  append (layers , extLayers ... )
177+ 
178+ 	if  options .WithEnvironment  {
179+ 		layers  =  append (layers , envFileLayers (envFiles )... )
180+ 	}
181+ 
182+ 	if  options .ResolveImageDigests  {
183+ 		yaml , err  :=  s .generateImageDigestsOverride (ctx , project )
184+ 		if  err  !=  nil  {
185+ 			return  nil , err 
186+ 		}
187+ 
188+ 		layerDescriptor  :=  oci .DescriptorForComposeFile ("image-digests.yaml" , yaml )
189+ 		layers  =  append (layers , layerDescriptor )
190+ 	}
191+ 	return  layers , nil 
192+ }
193+ 
178194func  processExtends (ctx  context.Context , project  * types.Project , extFiles  map [string ]string ) ([]v1.Descriptor , error ) {
179195	var  layers  []v1.Descriptor 
180196	moreExtFiles  :=  map [string ]string {}
181197	for  xf , hash  :=  range  extFiles  {
182- 		data , err  :=  processFile (ctx , xf , project , moreExtFiles )
198+ 		data , err  :=  processFile (ctx , xf , project , moreExtFiles ,  nil )
183199		if  err  !=  nil  {
184200			return  nil , err 
185201		}
@@ -204,7 +220,7 @@ func processExtends(ctx context.Context, project *types.Project, extFiles map[st
204220	return  layers , nil 
205221}
206222
207- func  processFile (ctx  context.Context , file  string , project  * types.Project , extFiles  map [string ]string ) ([]byte , error ) {
223+ func  processFile (ctx  context.Context , file  string , project  * types.Project , extFiles  map [string ]string ,  envFiles   map [ string ] string ) ([]byte , error ) {
208224	f , err  :=  os .ReadFile (file )
209225	if  err  !=  nil  {
210226		return  nil , err 
@@ -230,6 +246,15 @@ func processFile(ctx context.Context, file string, project *types.Project, extFi
230246		return  nil , err 
231247	}
232248	for  name , service  :=  range  base .Services  {
249+ 		for  i , envFile  :=  range  service .EnvFiles  {
250+ 			hash  :=  fmt .Sprintf ("%x.env" , sha256 .Sum256 ([]byte (envFile .Path )))
251+ 			envFiles [envFile .Path ] =  hash 
252+ 			f , err  =  transform .ReplaceEnvFile (f , name , i , hash )
253+ 			if  err  !=  nil  {
254+ 				return  nil , err 
255+ 			}
256+ 		}
257+ 
233258		if  service .Extends  ==  nil  {
234259			continue 
235260		}
@@ -376,18 +401,16 @@ func (s *composeService) checkEnvironmentVariables(project *types.Project, optio
376401	return  envVarList , nil 
377402}
378403
379- func  envFileLayers (project   * types. Project ) []v1.Descriptor  {
404+ func  envFileLayers (files   map [ string ] string ) []v1.Descriptor  {
380405	var  layers  []v1.Descriptor 
381- 	for  _ , service  :=  range  project .Services  {
382- 		for  _ , envFile  :=  range  service .EnvFiles  {
383- 			f , err  :=  os .ReadFile (envFile .Path )
384- 			if  err  !=  nil  {
385- 				// if we can't read the file, skip to the next one 
386- 				continue 
387- 			}
388- 			layerDescriptor  :=  oci .DescriptorForEnvFile (envFile .Path , f )
389- 			layers  =  append (layers , layerDescriptor )
406+ 	for  file , hash  :=  range  files  {
407+ 		f , err  :=  os .ReadFile (file )
408+ 		if  err  !=  nil  {
409+ 			// if we can't read the file, skip to the next one 
410+ 			continue 
390411		}
412+ 		layerDescriptor  :=  oci .DescriptorForEnvFile (hash , f )
413+ 		layers  =  append (layers , layerDescriptor )
391414	}
392415	return  layers 
393416}
0 commit comments