@@ -55,13 +55,18 @@ type dockerClientFactory struct {
5555}
5656
5757func newDockerClientFactory (daemonType DockerDaemonType , apiClient flyutil.Client , appName string , streams * iostreams.IOStreams , connectOverWireguard , recreateBuilder bool ) * dockerClientFactory {
58+ useManagedBuilder := daemonType .UseManagedBuilder ()
5859 remoteFactory := func () * dockerClientFactory {
5960 terminal .Debug ("trying remote docker daemon" )
6061 return & dockerClientFactory {
6162 mode : daemonType ,
6263 remote : true ,
6364 buildFn : func (ctx context.Context , build * build ) (* dockerclient.Client , error ) {
64- return newRemoteDockerClient (ctx , apiClient , appName , streams , build , cachedDocker , connectOverWireguard , recreateBuilder )
65+ cfg := config .FromContext (ctx )
66+ if cfg .DisableManagedBuilders {
67+ useManagedBuilder = false
68+ }
69+ return newRemoteDockerClient (ctx , apiClient , appName , streams , build , cachedDocker , connectOverWireguard , useManagedBuilder , recreateBuilder )
6570 },
6671 apiClient : apiClient ,
6772 appName : appName ,
@@ -108,15 +113,15 @@ func newDockerClientFactory(daemonType DockerDaemonType, apiClient flyutil.Clien
108113 }
109114}
110115
111- func NewDockerDaemonType (allowLocal , allowRemote , prefersLocal , useDepot , useNixpacks bool ) DockerDaemonType {
116+ func NewDockerDaemonType (allowLocal , allowRemote , prefersLocal , useDepot , useNixpacks bool , useManagedBuilder bool ) DockerDaemonType {
112117 daemonType := DockerDaemonTypeNone
113118 if allowLocal {
114119 daemonType = daemonType | DockerDaemonTypeLocal
115120 }
116- if allowRemote {
121+ if allowRemote || useManagedBuilder {
117122 daemonType = daemonType | DockerDaemonTypeRemote
118123 }
119- if useDepot {
124+ if useDepot && ! useManagedBuilder {
120125 daemonType = daemonType | DockerDaemonTypeDepot
121126 }
122127 if useNixpacks {
@@ -125,6 +130,9 @@ func NewDockerDaemonType(allowLocal, allowRemote, prefersLocal, useDepot, useNix
125130 if prefersLocal && ! useDepot {
126131 daemonType = daemonType | DockerDaemonTypePrefersLocal
127132 }
133+ if useManagedBuilder {
134+ daemonType = daemonType | DockerDaemonTypeManaged
135+ }
128136 return daemonType
129137}
130138
@@ -137,6 +145,7 @@ const (
137145 DockerDaemonTypePrefersLocal
138146 DockerDaemonTypeNixpacks
139147 DockerDaemonTypeDepot
148+ DockerDaemonTypeManaged
140149)
141150
142151func (t DockerDaemonType ) String () string {
@@ -157,6 +166,9 @@ func (t DockerDaemonType) String() string {
157166 if t & DockerDaemonTypeDepot != 0 {
158167 strs = append (strs , "depot" )
159168 }
169+ if t & DockerDaemonTypeManaged != 0 {
170+ strs = append (strs , "managed" )
171+ }
160172 if len (strs ) == 0 {
161173 return "none"
162174 }
@@ -192,6 +204,10 @@ func (t DockerDaemonType) UseDepot() bool {
192204 return (t & DockerDaemonTypeDepot ) != 0
193205}
194206
207+ func (t DockerDaemonType ) UseManagedBuilder () bool {
208+ return (t & DockerDaemonTypeManaged ) != 0
209+ }
210+
195211func (t DockerDaemonType ) PrefersLocal () bool {
196212 return (t & DockerDaemonTypePrefersLocal ) != 0
197213}
@@ -220,7 +236,7 @@ func logClearLinesAbove(streams *iostreams.IOStreams, count int) {
220236 }
221237}
222238
223- func newRemoteDockerClient (ctx context.Context , apiClient flyutil.Client , appName string , streams * iostreams.IOStreams , build * build , cachedClient * dockerclient.Client , connectOverWireguard , recreateBuilder bool ) (c * dockerclient.Client , err error ) {
239+ func newRemoteDockerClient (ctx context.Context , apiClient flyutil.Client , appName string , streams * iostreams.IOStreams , build * build , cachedClient * dockerclient.Client , connectOverWireguard , useManagedBuilder bool , recreateBuilder bool ) (c * dockerclient.Client , err error ) {
224240 ctx , span := tracing .GetTracer ().Start (ctx , "build_remote_docker_client" , trace .WithAttributes (
225241 attribute .Bool ("connect_over_wireguard" , connectOverWireguard ),
226242 ))
@@ -241,12 +257,20 @@ func newRemoteDockerClient(ctx context.Context, apiClient flyutil.Client, appNam
241257 var host string
242258 var app * fly.App
243259 var machine * fly.Machine
244- machine , app , err = remoteBuilderMachine (ctx , apiClient , appName , recreateBuilder )
260+ if useManagedBuilder {
261+ machine , app , err = remoteManagedBuilderMachine (ctx , apiClient , appName )
262+ } else {
263+ machine , app , err = remoteBuilderMachine (ctx , apiClient , appName , recreateBuilder )
264+ }
245265 if err != nil {
246266 tracing .RecordError (span , err , "failed to init remote builder machine" )
247267 return nil , err
248268 }
249269
270+ if useManagedBuilder {
271+ connectOverWireguard = false
272+ }
273+
250274 if ! connectOverWireguard && ! wglessCompatible {
251275 client := & http.Client {
252276 Transport : & http.Transport {
@@ -744,6 +768,20 @@ func remoteBuilderMachine(ctx context.Context, apiClient flyutil.Client, appName
744768 return builderMachine , builderApp , err
745769}
746770
771+ func remoteManagedBuilderMachine (ctx context.Context , apiClient flyutil.Client , appName string ) (* fly.Machine , * fly.App , error ) {
772+ if v := os .Getenv ("FLY_REMOTE_BUILDER_HOST" ); v != "" {
773+ return nil , nil , nil
774+ }
775+
776+ region := os .Getenv ("FLY_REMOTE_BUILDER_REGION" )
777+ org , err := apiClient .GetOrganizationByApp (ctx , appName )
778+ if err != nil {
779+ return nil , nil , err
780+ }
781+ builderMachine , builderApp , err := EnsureFlyManagedBuilder (ctx , org , region )
782+ return builderMachine , builderApp , err
783+ }
784+
747785func (d * dockerClientFactory ) IsRemote () bool {
748786 return d .remote
749787}
0 commit comments