flyway unable to connect to postgres container within docker-entrypoint-initdb.d script flyway unable to connect to postgres container within docker-entrypoint-initdb.d script docker docker

flyway unable to connect to postgres container within docker-entrypoint-initdb.d script


I had the same problem running flyway when creating a docker image for my database based on the postgres:10.5 image. I added the following to my entrypoint.sh before running flyway, to confirm that the problem I was seeing was caused by the docker-entrypoint.sh change @Nick Maraston posted in his answer:

echo "$(date) - waiting for database to start"while ! pg_isready -h localhost -p 5432 -d $POSTGRES_DBdo    echo "$(date) - waiting for database to start"    sleep 10done

The result was that the above code looped for ever. I then replaced it with the following code to restart the database listening for TCP/IP connections on localhost:

pg_ctl -D "$PGDATA" -m fast -w stoppg_ctl -D "$PGDATA" \            -o "-c listen_addresses='localhost'" \            -w start

Rather than restarting the database like this, a cleaner solution would be to use the JDBC -socketFactory option explained here.


I discovered the problem while digging through the images entry point script. A recent change to the image restricts postgres to only listen for connections over a unix domain socket during internal initialization: https://github.com/docker-library/postgres/pull/440


It is true that postgres docker is listening to a unix socket, eg. /var/run/postgresql/.s.PGSQL.5432. But it is not necessary to force the server to switch its listening address. Postgres database URI allows a connection string to point to a unix socket.

Reference: Connect to a database over a unix socket using SQLAlchemy

The example provided:

export DATABASE_URL=postgres://user:password@/dbname?host=/path/to/unix/socket

I was able to omit the host, and decided to use this environment variable in my /docker-entrypoint-initdb.d/*.sh script instead. Note that no string follows the @ symbol, nor is there a host query string here. You may need to explicitly define the host depending on your application.

Solution:

export DATABASE_URL="postgres://$POSTGRES_USER:$POSTGRES_PASSWORD@/$POSTGRES_DB"