github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/test/docker/docker.utils.go (about) 1 package docker 2 3 import ( 4 "fmt" 5 "net" 6 "sync" 7 "time" 8 ) 9 10 var lock sync.Mutex 11 12 func nextPort(port *int) int { 13 lock.Lock() 14 *port = *port + 1 15 16 defer lock.Unlock() 17 return *port 18 } 19 20 func isOpen(port string) bool { 21 timeout := time.Second 22 conn, err := net.DialTimeout("tcp", net.JoinHostPort("", port), timeout) 23 if err != nil { 24 return true 25 } 26 if conn != nil { 27 defer conn.Close() 28 return false 29 } 30 return false 31 } 32 33 func GetAvailablePort(defaultPort int) string { 34 if isOpen(fmt.Sprint(defaultPort)) { 35 return fmt.Sprint(defaultPort) 36 } 37 for { 38 p := fmt.Sprintf("%d", nextPort(&defaultPort)) 39 if isOpen(p) { 40 return p 41 } 42 } 43 }