@@ -431,6 +431,10 @@ func (m *DefaultManager) createAliasOverride(network string, routes []route) (st
431431func (m * DefaultManager ) ensureCaddy (network string , routes []route ) error {
432432 inspect := builder .NewCommand ("docker" , "inspect" , "--format" , "{{.State.Running}}" , caddyContainer )
433433 running , err := m .shell .Exec (inspect )
434+ ports := make (map [int ]bool )
435+ var preservedApps []byte
436+ var preservedAppsExist bool
437+ var preservedNetworks []string
434438 if err == nil {
435439 compatibility , inspectErr := m .shell .Exec (builder .NewCommand ("docker" , "inspect" , "--format" , "{{json .NetworkSettings.Networks}}|{{json .Config.Entrypoint}}|{{json .Config.Cmd}}" , caddyContainer ))
436440 if inspectErr != nil {
@@ -442,6 +446,33 @@ func (m *DefaultManager) ensureCaddy(network string, routes []route) error {
442446 return err
443447 }
444448 err = errors .New ("legacy proxy container removed" )
449+ } else {
450+ for _ , route := range routes {
451+ if _ , portErr := m .shell .Exec (builder .NewCommand ("docker" , "port" , caddyContainer ), fmt .Sprintf ("%d/tcp" , route .Listen )); portErr == nil {
452+ ports [route .Listen ] = true
453+ continue
454+ }
455+ if preservedApps , preservedAppsExist , err = m .snapshotApps (); err != nil {
456+ return err
457+ }
458+ bindings , inspectErr := m .shell .Exec (builder .NewCommand ("docker" , "inspect" , "--format" , "{{json .HostConfig.PortBindings}}" , caddyContainer ))
459+ if inspectErr != nil {
460+ return inspectErr
461+ }
462+ for port := range parseContainerPorts (bindings ) {
463+ ports [port ] = true
464+ }
465+ networks , inspectErr := m .shell .Exec (builder .NewCommand ("docker" , "inspect" , "--format" , "{{json .NetworkSettings.Networks}}" , caddyContainer ))
466+ if inspectErr != nil {
467+ return inspectErr
468+ }
469+ preservedNetworks = parseDockerObjectKeys (networks )
470+ if err = m .shell .Interactive (builder .NewCommand ("docker" , "rm" , "--force" ), caddyContainer ); err != nil {
471+ return err
472+ }
473+ err = errors .New ("proxy listener expansion required" )
474+ break
475+ }
445476 }
446477 }
447478 if err != nil {
@@ -455,7 +486,6 @@ func (m *DefaultManager) ensureCaddy(network string, routes []route) error {
455486 }
456487 }
457488 args := []string {"run" , "-d" , "--name" , caddyContainer , "--restart" , "unless-stopped" , "--network" , caddyAdminNet , "--network-alias" , caddyAdminHost , "-p" , "127.0.0.1:2019:2019" }
458- ports := make (map [int ]bool )
459489 for _ , route := range routes {
460490 ports [route .Listen ] = true
461491 }
@@ -494,6 +524,14 @@ func (m *DefaultManager) ensureCaddy(network string, routes []route) error {
494524 return err
495525 }
496526 }
527+ for _ , previousNetwork := range preservedNetworks {
528+ if previousNetwork == caddyAdminNet || previousNetwork == network {
529+ continue
530+ }
531+ if err = m .shell .Interactive (builder .NewCommand ("docker" , "network" , "connect" , previousNetwork ), caddyContainer ); err != nil {
532+ return err
533+ }
534+ }
497535
498536 for _ , route := range routes {
499537 if _ , err = m .shell .Exec (builder .NewCommand ("docker" , "port" , caddyContainer ), fmt .Sprintf ("%d/tcp" , route .Listen )); err != nil {
@@ -505,6 +543,9 @@ func (m *DefaultManager) ensureCaddy(network string, routes []route) error {
505543 if requestErr == nil {
506544 _ = response .Body .Close ()
507545 if response .StatusCode < 500 {
546+ if preservedAppsExist {
547+ return m .restoreApps (preservedApps , true )
548+ }
508549 return nil
509550 }
510551 }
@@ -513,6 +554,34 @@ func (m *DefaultManager) ensureCaddy(network string, routes []route) error {
513554 return errors .New ("kool proxy did not become ready" )
514555}
515556
557+ func parseContainerPorts (raw string ) map [int ]bool {
558+ ports := make (map [int ]bool )
559+ var bindings map [string ]interface {}
560+ if json .Unmarshal ([]byte (raw ), & bindings ) != nil {
561+ return ports
562+ }
563+ for key := range bindings {
564+ port , err := strconv .Atoi (strings .TrimSuffix (key , "/tcp" ))
565+ if err == nil {
566+ ports [port ] = true
567+ }
568+ }
569+ return ports
570+ }
571+
572+ func parseDockerObjectKeys (raw string ) []string {
573+ var object map [string ]interface {}
574+ if json .Unmarshal ([]byte (raw ), & object ) != nil {
575+ return nil
576+ }
577+ keys := make ([]string , 0 , len (object ))
578+ for key := range object {
579+ keys = append (keys , key )
580+ }
581+ sort .Strings (keys )
582+ return keys
583+ }
584+
516585func (m * DefaultManager ) ensureBaseConfig () (string , error ) {
517586 home , err := os .UserHomeDir ()
518587 if err != nil {
0 commit comments