title: flyway unable to connect to postgres container within docker-entrypoint-initdb.d script
body: <p>I'm trying to extend the <a href="https://hub.docker.com/_/postgres/" rel="noreferrer">postgres Docker</a> image to potentially (via an environment variable flag) execute flyway DB migrations on DB init. My Dockerfile is here:</p>
  
  <pre><code>FROM postgres:9.6
  
  # Install curl and java (for Flyway)
  RUN set -x \
      &amp;&amp; apt-get update \
      &amp;&amp; apt-get install -y --no-install-recommends ca-certificates curl openjdk-8-jre 
  
  # Install Flyway
  ENV FLYWAY_VERSION 4.2.0
  ENV FLYWAY_INSTALL_DIR /usr/src/flyway
  ENV FLYWAY_CONF ${FLYWAY_INSTALL_DIR}/flyway-${FLYWAY_VERSION}/conf/flyway.conf
  ENV FLYWAY_EXE ${FLYWAY_INSTALL_DIR}/flyway-${FLYWAY_VERSION}/flyway
  RUN mkdir -p ${FLYWAY_INSTALL_DIR} &amp;&amp; \
      curl -L https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/${FLYWAY_VERSION}/flyway-commandline-${FLYWAY_VERSION}.tar.gz | \
      tar -xzC ${FLYWAY_INSTALL_DIR} &amp;&amp; \
      chmod +x ${FLYWAY_EXE}
  
  # Copy migration scripts
  ENV MIGRATIONS_LOCATION /flyway/migrations
  COPY migrations $MIGRATIONS_LOCATION
  
  COPY init_db.sh /docker-entrypoint-initdb.d/init_db.sh
  </code></pre>
  
  <p>With my <code>init_db.sh</code> startup script:</p>
  
  <pre><code>#!/bin/bash
  set -e
  
  RUN_MIGRATIONS="${RUN_MIGRATIONS:-false}"
  DB_URL="jdbc:postgresql://localhost:5432/$DB_NAME"
  
  psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" &lt;&lt;-EOSQL
      CREATE DATABASE $DB_NAME;
  EOSQL
  
  if [ "$RUN_MIGRATIONS" == "true" ]; then
          echo "running migrations ..."
          ${FLYWAY_EXE} -user=$POSTGRES_USER -password=$POSTGRES_PASSWORD -url=$DB_URL -locations="filesystem:$MIGRATIONS_LOCATION" migrate
  fi
  </code></pre>
  
  <p>However, when running the container with <code>RUN_MIGRATIONS=true</code>, flyway fails to connect to postgres:</p>
  
  <pre><code>docker build . -t postgres-flyway &amp;&amp; docker run -e DB_NAME=db -e RUN_MIGRATIONS=true -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres postgres-flyway
  The files belonging to this database system will be owned by user "postgres".
  This user must also own the server process.
  
  The database cluster will be initialized with locale "en_US.utf8".
  The default database encoding has accordingly been set to "UTF8".
  The default text search configuration will be set to "english".
  
  Data page checksums are disabled.
  
  fixing permissions on existing directory /var/lib/postgresql/data ... ok
  creating subdirectories ... ok
  selecting default max_connections ... 100
  selecting default shared_buffers ... 128MB
  selecting dynamic shared memory implementation ... posix
  creating configuration files ... ok
  running bootstrap script ... ok
  performing post-bootstrap initialization ... ok
  syncing data to disk ... ok
  
  WARNING: enabling "trust" authentication for local connections
  You can change this by editing pg_hba.conf or using the option -A, or
  --auth-local and --auth-host, the next time you run initdb.
  
  Success. You can now start the database server using:
  
      pg_ctl -D /var/lib/postgresql/data -l logfile start
  
  waiting for server to start....LOG:  database system was shut down at 2018-08-06 02:19:32 UTC
  LOG:  MultiXact member wraparound protections are now enabled
  LOG:  autovacuum launcher started
  LOG:  database system is ready to accept connections
   done
  server started
  ALTER ROLE
  
  
  /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/init_db.sh
  CREATE DATABASE
  running migrations ...
  Flyway 4.2.0 by Boxfuse
  
  ERROR:
  Unable to obtain Jdbc connection from DataSource (jdbc:postgresql://localhost:5432/db) for user 'postgres': Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  SQL State  : 08001
  Error Code : 0
  Message    : Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
  </code></pre>
  
  <p>The postgres image runs postgres on port 5432 (as usual) so I'm at a loss on why flyway is unable to connect to postgres over <code>localhost:5432</code>.</p>
  
  <p>I also noticed that within this context, <code>pg_isready</code> states that postgres is accepting connections but when specifying the hostname as <code>localhost</code> or <code>127.0.0.1</code> it is unable to reach postgres either. That is, by inserting a few <code>pg_isready</code> commands in my <code>init_db.sh</code> script:</p>
  
  <pre><code>...
  pg_isready
  pg_isready -p 5432
  pg_isready -h localhost -p 5432
  ...
  </code></pre>
  
  <p>I see the following log output on postgres init:</p>
  
  <pre><code>...
  /var/run/postgresql:5432 - accepting connections
  /var/run/postgresql:5432 - accepting connections
  localhost:5432 - no response
  ...
  </code></pre>
  
  <p>I'm suspicious that I've reached a limitation of postgres' initialize context, but I would like to understand why postgres is unreachable over <code>localhost/127.0.0.1:5432</code> at this point of initialization.</p>