@@ -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