Skip to content

palfrey/wait-for-db

Repository files navigation

wait-for-db

Linux

Basically, wait-for-it but for databases.

Often (especially within Dockerised configurations) there is the problem of "I need the database to be up before step X will work". Now, if all you need is "up" then generally wait-for-it and the database port is enough. If on the other hand you've got migration scripts or other such things you need to run on your database, up isn't enough.

wait-for-db lets you wait for a particular database to be both up (in the sense of "will let you connect without errors") and optionally "returns at least one row to a particular query". It will also attempt to fail immediately for permanent failures (e.g. syntax errors)

Usage

  1. Download static binary from https://github.com/palfrey/wait-for-db/releases into your Docker image
  2. ./wait-for-db <options>

Options

  • -m/--mode: postgres or odbc
  • -c/--connection-string: Mode-appropriate connection string. So postgresql://<username>:<password>@<host>:<port> or Driver=<path to driver>;<various ODBC options> depending on your driver
  • -s/--sql-query: SQL query to run once connected. It should return at least one row, or will be regarded as failing. Default is no query, just be regarded as succeeding the moment it connects.
  • -p/--pause: Pause between attempts for non-permanent failures. Default is 3 seconds
  • -t/--timeout: Time to wait before failing entirely. Default is wait forever.

Database support

  • Anything you've got an ODBC driver for (which should be most SQL databases)
  • Postgres

Development

To test the Postgres/ODBC support do the following

  1. Generate a server.key and server.crt (so we can test TLS links)
openssl req -new -text -passout pass:abcd -subj /CN=localhost -out server.req
openssl rsa -in privkey.pem -passin pass:abcd -out server.key
openssl req -x509 -in server.req -text -key server.key -out server.crt
  1. Set postgres (alpine) user as owner of the server.key and permissions to 600
sudo chown 0:70 server.key
sudo chmod 640 server.key
  1. Start a postgres docker container, mapping the .key and .crt into the image.
docker run -p 5432 \
  -v "$PWD/server.crt:/var/lib/postgresql/server.crt:ro" \
  -v "$PWD/server.key:/var/lib/postgresql/server.key:ro" \
  -e POSTGRES_HOST_AUTH_METHOD=trust \
  postgres:11-alpine \
  -c ssl=on \
  -c ssl_cert_file=/var/lib/postgresql/server.crt \
  -c ssl_key_file=/var/lib/postgresql/server.key
  1. Find the port exported by the docker container and export it as POSTGRES_PORT e.g. export POSTGRES_PORT=32768

On macOS:

  1. brew install psqlodbc sqliteodbc
  2. POSTGRES_SERVER=localhost POSTGRES_USERNAME=postgres POSTGRES_PASSWORD= RUST_BACKTRACE=1 POSTGRES_DRIVER=`brew --prefix psqlodbc`/lib/psqlodbca.so SQLITE_DRIVER=`brew --prefix sqliteodbc`/lib/libsqlite3odbc-0.9996.dylib cargo test -- --nocapture

On Debian

  1. sudo apt-get install odbc-postgresql libsqliteodbc
  2. ODBC_SYS_STATIC_PATH=/usr/lib/x86_64-linux-gnu/ POSTGRES_SERVER=localhost POSTGRES_USERNAME=postgres POSTGRES_PASSWORD= RUST_BACKTRACE=1 POSTGRES_DRIVER=/usr/lib/x86_64-linux-gnu/odbc/psqlodbca.so SQLITE_DRIVER=/usr/lib/x86_64-linux-gnu/odbc/libsqlite3odbc-0.9996.so cargo test -- --nocapture