Both utility and Go package to wait for ports to open (TCP, UDP).
Both utility and Go package to wait for ports to open (TCP, UDP).
In dockerized applications, we usually deploy several containers along with the main program container. We need to know if containers are started, so we can continue to execute our program or fail it after some deadline.
There are a lot of examples on the internet that advise us to use several bash commands like nc, timeout, curl. But what if we have a Go program with a minimal Docker image FROM scratch that does not have bash? We could use this package as a library in our program — just add a couple of lines of code to check if some ports are available.
This package can also be downloaded as a utility and used from the command line.
import "github.com/antelman107/net-wait-go/wait"
if !wait.New().Do([]string{"postgres:5432"}) {
logger.Error("db is not available")
return
}
import "github.com/antelman107/net-wait-go/wait"
if !wait.New(
wait.WithProto("tcp"),
wait.WithWait(200*time.Millisecond),
wait.WithBreak(50*time.Millisecond),
wait.WithDeadline(15*time.Second),
wait.WithDebug(true),
).Do([]string{"postgres:5432"}) {
logger.Error("db is not available")
return
}
net-wait-go
-addrs string
address:port(,address:port,address:port,...)
-deadline uint
deadline in milliseconds (default 10000)
-debug
debug messages toggler
-delay uint
break between requests in milliseconds (default 50)
-packet string
UDP packet to be sent
-proto string
tcp (default "tcp")
-wait uint
delay of single request in milliseconds (default 100)
net-wait-go -addrs ya.ru:443 -debug true
2020/06/30 18:07:38 ya.ru:443 is OK
Return code is 0
net-wait-go -addrs ya.ru:443,yandex.ru:443 -debug true
2020/06/30 18:09:24 yandex.ru:443 is OK
2020/06/30 18:09:24 ya.ru:443 is OK
Return code is 0
net-wait-go -addrs ya.ru:445,yandex.ru:445 -debug true
2020/06/30 18:09:24 yandex.ru:445 is FAILED
2020/06/30 18:09:24 ya.ru:445 is FAILED
...
Return code is 1
Since UDP as a protocol does not provide a connection between a server and clients, it is not supported in most popular utilities:
CAVEATS
UDP port scans will always succeed (i.e. report the port as open)
net-wait-go provides UDP support, working in the following way:
Counter Strike game server is accessible via UDP. Let’s check a random Counter Strike server by sending an A2S_INFO packet (documentation):
net-wait-go -proto udp -addrs 46.174.53.245:27015,185.158.113.136:27015 -packet '/////1RTb3VyY2UgRW5naW5lIFF1ZXJ5AA==' -debug true
2020/07/12 15:13:25 udp 185.158.113.136:27015 is OK
2020/07/12 15:13:25 udp 46.174.53.245:27015 is OK
Return code is 0
The -packet value here is the base64-encoded A2S_INFO packet, which is documented here.
Available here — github.com/antelman107/net-wait-go.
Previously we discussed local debugging with GoLand IDE. Now we’ll discuss how to remotely debug a program running inside a Docker container using Visual Studio Code and GoLand IDE.
Read More → Docker Debugger Delve Vscode GolandDocker container deployment has many advantages over binary deployment. Let’s dive into advantages and see how we can implement docker container deployment from Gitlab CI. Let’s talk standard docker can help us. Any docker orchestration tools (Kubernetes, for example) will be observed in future articles.
Read More → Docker Deploy Gitlab Ci/CdLet’s discuss how to build a minimal Docker image for a Go program.
Read More → Docker Compilation Upx LdflagsAn example of a simple TCP chat in Go with logic explanation.
Read More → Tcp Server Chat