77 "io/ioutil"
88 "runtime"
99 "strings"
10+ "time"
1011
1112 "github.com/Sirupsen/logrus"
1213 "github.com/docker/docker/api/types"
@@ -15,6 +16,7 @@ import (
1516 "github.com/docker/docker/builder"
1617 "github.com/docker/docker/builder/dockerfile/command"
1718 "github.com/docker/docker/builder/dockerfile/parser"
19+ "github.com/docker/docker/builder/fscache"
1820 "github.com/docker/docker/builder/remotecontext"
1921 "github.com/docker/docker/client/session"
2022 "github.com/docker/docker/pkg/archive"
@@ -52,16 +54,22 @@ type BuildManager struct {
5254 backend builder.Backend
5355 pathCache pathCache // TODO: make this persistent
5456 sg SessionGetter
57+ fsCache * fscache.FSCache
5558}
5659
5760// NewBuildManager creates a BuildManager
58- func NewBuildManager (b builder.Backend , sg SessionGetter , idMappings * idtools.IDMappings ) * BuildManager {
59- return & BuildManager {
61+ func NewBuildManager (b builder.Backend , sg SessionGetter , fsCache * fscache. FSCache , idMappings * idtools.IDMappings ) ( * BuildManager , error ) {
62+ bm := & BuildManager {
6063 backend : b ,
6164 pathCache : & syncmap.Map {},
6265 sg : sg ,
6366 archiver : chrootarchive .NewArchiver (idMappings ),
67+ fsCache : fsCache ,
6468 }
69+ if err := fsCache .RegisterTransport (remotecontext .ClientSessionRemote , NewClientSessionTransport ()); err != nil {
70+ return nil , err
71+ }
72+ return bm , nil
6573}
6674
6775// Build starts a new build from a BuildConfig
@@ -75,13 +83,13 @@ func (bm *BuildManager) Build(ctx context.Context, config backend.BuildConfig) (
7583 if err != nil {
7684 return nil , err
7785 }
78- if source != nil {
79- defer func () {
86+ defer func () {
87+ if source != nil {
8088 if err := source .Close (); err != nil {
8189 logrus .Debugf ("[BUILDER] failed to remove temporary context: %v" , err )
8290 }
83- }()
84- }
91+ }
92+ }()
8593
8694 // TODO @jhowardmsft LCOW support - this will require rework to allow both linux and Windows simultaneously.
8795 // This is an interim solution to hardcode to linux if LCOW is turned on.
@@ -95,8 +103,10 @@ func (bm *BuildManager) Build(ctx context.Context, config backend.BuildConfig) (
95103 ctx , cancel := context .WithCancel (ctx )
96104 defer cancel ()
97105
98- if err := bm .initializeClientSession (ctx , cancel , config .Options ); err != nil {
106+ if src , err := bm .initializeClientSession (ctx , cancel , config .Options ); err != nil {
99107 return nil , err
108+ } else if src != nil {
109+ source = src
100110 }
101111
102112 builderOptions := builderOptions {
@@ -111,20 +121,38 @@ func (bm *BuildManager) Build(ctx context.Context, config backend.BuildConfig) (
111121 return newBuilder (ctx , builderOptions ).build (source , dockerfile )
112122}
113123
114- func (bm * BuildManager ) initializeClientSession (ctx context.Context , cancel func (), options * types.ImageBuildOptions ) error {
124+ func (bm * BuildManager ) initializeClientSession (ctx context.Context , cancel func (), options * types.ImageBuildOptions ) (builder. Source , error ) {
115125 if options .SessionID == "" || bm .sg == nil {
116- return nil
126+ return nil , nil
117127 }
118128 logrus .Debug ("client is session enabled" )
129+
130+ ctx , cancelCtx := context .WithTimeout (ctx , sessionConnectTimeout )
131+ defer cancelCtx ()
132+
119133 c , err := bm .sg .Get (ctx , options .SessionID )
120134 if err != nil {
121- return err
135+ return nil , err
122136 }
123137 go func () {
124138 <- c .Context ().Done ()
125139 cancel ()
126140 }()
127- return nil
141+ if options .RemoteContext == remotecontext .ClientSessionRemote {
142+ st := time .Now ()
143+ csi , err := NewClientSessionSourceIdentifier (ctx , bm .sg ,
144+ options .SessionID , []string {"/" })
145+ if err != nil {
146+ return nil , err
147+ }
148+ src , err := bm .fsCache .SyncFrom (ctx , csi )
149+ if err != nil {
150+ return nil , err
151+ }
152+ logrus .Debugf ("sync-time: %v" , time .Since (st ))
153+ return src , nil
154+ }
155+ return nil , nil
128156}
129157
130158// builderOptions are the dependencies required by the builder
0 commit comments