Open blacktop opened 8 years ago
I made an POSIX version, which you can find here.
It uses nc
and @vishnubob prefers a version that has minimum dependencies, so it was not merged.
See the closed pull request
First off thank you @raphaelahrens that is awesome! second off @vishnubob I understand your desire to keep the dependancies to 0, but nc is included in alpine and with the docker community all moving to alpine I think it would still be valuable?
@raphaelahrens when I run your script with no timeout setting I kept getting the error: timeout: can't execute '15': No such file or directory
15 being the default TIMEOUT. However, when I used -1
no-timeout it worked?
@blacktop could you create an issue on my fork and describe how you call the script and under which OS/distro?
it looks like it is the same thing that happened here #5
also there is no UI in github for issues on forks.
Pull Requests #17 fixes it for me, but requires I install bash :(
@blacktop Ah ok I will take a look at it seems like alpine doesn't have timeout either.
It doesn't work for Alpine Linux.
Let me share a tool I have written in Go with cross platform support and which has the same purpose of this project (even the name is the same) https://github.com/maxcnunes/waitforit.
@maxcnunes that is a really nice solution to this problem 👏
There is always https://github.com/depop/wait-for-it but it has a reliance on bash shell. It also supports multiple host waits
@raphaelahrens have you had any trouble with nc
returning a "bad address" error?
@eddieajau no I haven't. Sounds like an address resolution problem. Is the address reachable from the machine/vm?
@raphaelahrens so the problem is that when our Docker machine is spinning up, some of the containers take time to register their host names. While wait-for-it
will genuinely wait for a port to open, it exits immediately if the host is not yet resolvable. This is because nc
will exit with a code of 1
immediately, causing timeout
to exit as well.
So the issue is that wait-for-it
also needs to be able to wait for a host to be available within the given TIMEOUT.
In the meantime wait-for-command can help. It is a Posix sh compliant which receives a command an waits for a specific exit status to finish waiting. It does not depend on a specific command so you could use whatever your distribution has available.
In Alpine Linux for port 5432 you could do:
./wait-for-command.sh -c 'nc -z db 5432' && [your-after-the-wait-commands]
Also for other distributions you could use:
wait-for-command.sh -c 'echo > /dev/tcp/127.0.0.1/5432' && [your-after-the-wait-commands]
wait-for-command.sh -s 0 57 -c 'curl 127.0.0.1:5432' && [your-after-the-wait-commands]
Notice you can specify the matching exit status with -s
.
:+1:
Would much prefer a POSIX version, but @ettore26's solution should be good enough for now.
hey guys, maybe a bit late for the party, but there is another (POSIX shell compliant) alternative capable of waiting for any type of command called: wtfc. It's heavily inspired by @ettore26 solution and well tested on different envs (Busybox, Alpine, Debian, OSX, see: https://travis-ci.org/typekpb/wtfc)
I'd rather using nc command on alpine to wait for tcp connection.
while ! nc -z rails 3000 ; do sleep 1 ; done
That would be awesome !