A small command line utility to wait for other docker images to be started while using docker-compose. It permits to wait for a fixed amount of seconds and/or to wait until a TCP port is open on a target image.
This utility should be used in the docker build process and launched before your application starts.
For example, your application "MySuperApp" uses MongoDB, Postgres and MySql (wow!) and you want to be sure that, when it starts, all other systems are available, then simply customize your dockerfile this way:
## Use whatever base image FROM alpine ## Add your application to the docker image ADD MySuperApp.sh /MySuperApp.sh ## Add the wait script to the image ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait RUN chmod +x /wait ## Launch the wait tool and then your application CMD /wait && /MySuperApp.sh
Done! the image is ready.
Now let's modify the docker-compose.yml file:
version: "3" services: mongo: image: mongo:3.4 hostname: mongo ports: - "27017:27017" postgres: image: "postgres:9.4" hostname: postgres ports: - "5432:5432" mysql: image: "mysql:5.7" hostname: mysql ports: - "3306:3306" mySuperApp: image: "mySuperApp:latest" hostname: mySuperApp environment: WAIT_HOSTS: postgres:5432, mysql:3306, mongo:27017
When docker-compose is started (or Kubernetes or docker stack or whatever), your application will be started only when all the pairs host:port in the WAIT_HOSTS variable are available. The WAIT_HOSTS environment variable is not mandatory, if not declared, the script executes without waiting.
If you want to use the script directly in docker-compose.yml instead of the Dockerfile, please note that the
command: configuration option is limited to a single command so you should wrap in a
sh call. For example:
command: sh -c "/wait && /MySuperApp.sh"
Do note the recommended way of using
wait is with the shell operator
&&, which implies the requirement of a shell. This introduces a requirement for Docker use where bases images like scratch not offering a shell cannot be used.
The behaviour of the wait utility can be configured with the following environment variables:
The simplest way of getting the wait executable is to download it from
This is a pre-built executable for Linux x64 systems which are the default ones in Docker. In addition, it is built with MUSL for maximum portability.
If you need it for a different architecture, you should clone this repository and build it for your target.
As it has no external dependencies, an being written in the mighty rust
programming language, the build process is just a simple
cargo build --release
(well... of course you need to install the rust compiler before...)
For everything involving cross-compilation, you should take a look at Cross.
For example, to build for a raspberry pi, everything you have to do is:
cargo install cross cross build --target=armv7-unknown-linux-musleabihf --release
Use your shiny new executable on your raspberry device!
This utility was explicitly written to be used with docker-compose; however, it can be used everywhere since it has no dependencies on docker.