@@ -10,6 +10,7 @@ import {
1010import {
1111 runDockerNetworkContainerCount ,
1212 runDockerNetworkCreateBridge ,
13+ runDockerNetworkCreateBridgeWithSubnet ,
1314 runDockerNetworkExists ,
1415 runDockerNetworkRemove
1516} from "../shell/docker.js"
@@ -20,6 +21,54 @@ const protectedNetworkNames = new Set(["bridge", "host", "none"])
2021const isProtectedNetwork = ( networkName : string , sharedNetworkName : string ) : boolean =>
2122 protectedNetworkNames . has ( networkName ) || networkName === sharedNetworkName
2223
24+ const sharedNetworkFallbackSubnets : ReadonlyArray < string > = [
25+ "10.250.0.0/24" ,
26+ "10.251.0.0/24" ,
27+ "10.252.0.0/24" ,
28+ "10.253.0.0/24" ,
29+ "172.31.250.0/24" ,
30+ "172.31.251.0/24" ,
31+ "172.31.252.0/24" ,
32+ "172.31.253.0/24" ,
33+ "192.168.250.0/24" ,
34+ "192.168.251.0/24"
35+ ]
36+
37+ const createSharedNetworkWithSubnetFallback = (
38+ cwd : string ,
39+ networkName : string
40+ ) : Effect . Effect < boolean , PlatformError , CommandExecutor > =>
41+ Effect . gen ( function * ( _ ) {
42+ for ( const subnet of sharedNetworkFallbackSubnets ) {
43+ const created = yield * _ (
44+ runDockerNetworkCreateBridgeWithSubnet ( cwd , networkName , subnet ) . pipe (
45+ Effect . as ( true ) ,
46+ Effect . catchTag ( "DockerCommandError" , ( error ) =>
47+ Effect . logWarning (
48+ `Shared network create fallback failed (${ networkName } , subnet ${ subnet } , exit ${ error . exitCode } ); trying next subnet.`
49+ ) . pipe ( Effect . as ( false ) )
50+ )
51+ )
52+ )
53+ if ( created ) {
54+ yield * _ ( Effect . log ( `Created shared Docker network ${ networkName } with subnet ${ subnet } .` ) )
55+ return true
56+ }
57+ }
58+ return false
59+ } )
60+
61+ const ensureSharedNetworkExists = (
62+ cwd : string ,
63+ networkName : string
64+ ) : Effect . Effect < void , DockerCommandError | PlatformError , CommandExecutor > =>
65+ runDockerNetworkCreateBridge ( cwd , networkName ) . pipe (
66+ Effect . catchTag ( "DockerCommandError" , ( error ) =>
67+ createSharedNetworkWithSubnetFallback ( cwd , networkName ) . pipe (
68+ Effect . flatMap ( ( created ) => ( created ? Effect . void : Effect . fail ( error ) ) )
69+ ) )
70+ )
71+
2372// CHANGE: ensure shared docker network exists before compose up
2473// WHY: avoid compose failures when using `external: true` shared network mode
2574// QUOTE(ТЗ): "Что бы текущие проекты не ложились"
@@ -44,7 +93,7 @@ export const ensureComposeNetworkReady = (
4493 exists
4594 ? Effect . void
4695 : Effect . log ( `Creating shared Docker network: ${ networkName } ` ) . pipe (
47- Effect . zipRight ( runDockerNetworkCreateBridge ( cwd , networkName ) )
96+ Effect . zipRight ( ensureSharedNetworkExists ( cwd , networkName ) )
4897 ) )
4998 )
5099}
0 commit comments