@@ -29,6 +29,7 @@ import (
2929type pushOptions struct {
3030 registry registryOptions
3131 tag string
32+ bundle string
3233 platforms []string
3334}
3435
@@ -45,23 +46,46 @@ func pushCmd(dockerCli command.Cli) *cobra.Command {
4546 }
4647 flags := cmd .Flags ()
4748 flags .StringVarP (& opts .tag , "tag" , "t" , "" , "Target registry reference (default: <name>:<version> from metadata)" )
49+ flags .StringVar (& opts .bundle , "bundle" , "" , "Push a specific bundle" )
4850 flags .StringSliceVar (& opts .platforms , "platform" , nil , "For multi-arch service images, only push the specified platforms" )
4951 opts .registry .addFlags (flags )
5052 return cmd
5153}
5254
5355func runPush (dockerCli command.Cli , name string , opts pushOptions ) error {
5456 defer muteDockerCli (dockerCli )()
55- app , err := packager .Extract (name )
56- if err != nil {
57- return err
58- }
59- defer app .Cleanup ()
60- bndl , err := makeBundleFromApp (dockerCli , app , nil )
61- if err != nil {
62- return err
57+
58+ var (
59+ bndl * bundle.Bundle
60+ meta metadata.AppMetadata
61+ )
62+ if opts .bundle == "" {
63+ app , err := packager .Extract (name )
64+ if err != nil {
65+ return err
66+ }
67+ defer app .Cleanup ()
68+ if bndl , err = makeBundleFromApp (dockerCli , app , nil ); err != nil {
69+ return err
70+ }
71+ meta = app .Metadata ()
72+ } else {
73+ if name != "" {
74+ fmt .Fprintf (os .Stderr , "WARNING: ignoring dockerapp at %q, pushing app directly from %q\n " , name , opts .bundle )
75+ }
76+ r , err := os .Open (opts .bundle )
77+ if err != nil {
78+ return err
79+ }
80+ if b , err := bundle .ParseReader (r ); err == nil {
81+ bndl = & b // TODO: PR to change return type of ParseReader
82+ } else {
83+ return err
84+ }
85+ meta = metadata .FromBundle (bndl )
6386 }
64- retag , err := shouldRetagInvocationImage (app .Metadata (), bndl , opts .tag )
87+
88+ retag , err := shouldRetagInvocationImage (meta , bndl , opts .tag )
6589 if err != nil {
6690 return err
6791 }
0 commit comments