title: How to start flyway after database initialization in Docker
body: <p>I have following docker compose file(<code>docker-compose-dev.yml</code>):</p>
  
  <pre><code>version: '3'
  services:
    my_sql_db:
      image: percona:latest
      container_name: my_sql_db
      environment:
  </code></pre>
  
  <hr>
  
  <pre><code>      MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: abhs
      ports:
      - "3306:3306"
  
    migration:
      image: boxfuse/flyway:latest
      container_name: flyway_migration
      volumes:
        - ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
      command: -url=jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false -user=root -password=password migrate
      depends_on:
      - my_sql_db
  </code></pre>
  
  <p>and following <code>docker-compose.yml</code>:</p>
  
  <pre><code>version: '3'
  services:
    migration:
      image: boxfuse/flyway:latest
      container_name: flyway_migration
      volumes:
       - ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
  </code></pre>
  
  <p>Then I execute following command:</p>
  
  <pre><code>docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
  </code></pre>
  
  <p>And It lead to error:</p>
  
  <p>In logs I see following:</p>
  
  <pre><code>my_sql_db    | Initializing database
  flyway_migration  | Flyway Community Edition 5.1.4 by Boxfuse
  flyway_migration  |
  my_sql_db    | 2018-08-24T08:47:41.616694Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
  my_sql_db    | 2018-08-24T08:47:41.616747Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
  flyway_migration  | ERROR:
  flyway_migration  | Unable to obtain connection from database (jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false) for user 'root': Could not connect to address=(host=my_sql_db)(port=3306)(type=master) : Connection refused (Connection refused)
  flyway_migration  | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  flyway_migration  | SQL State  : 08
  flyway_migration  | Error Code : -1
  flyway_migration  | Message    : Could not connect to address=(host=my_sql_db)(port=3306)(type=master) : Connection refused (Connection refused)
  my_sql_db    | 2018-08-24T08:47:43.024690Z 0 [Warning] InnoDB: New log files created, LSN=45790
  flyway_migration  |
  my_sql_db    | 2018-08-24T08:47:43.443625Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
  my_sql_db    | 2018-08-24T08:47:43.588008Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 5dc59a4f-a77a-11e8-b6cb-0242ac130002.
  my_sql_db    | 2018-08-24T08:47:43.760654Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
  my_sql_db    | 2018-08-24T08:47:44.518107Z 0 [Warning] CA certificate ca.pem is self signed.
  my_sql_db    | 2018-08-24T08:47:44.925466Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
  my_sql_db    | 2018-08-24T08:47:54.762213Z 1 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.762517Z 1 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.762889Z 1 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.763244Z 1 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.763472Z 1 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.763788Z 1 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.763928Z 1 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | 2018-08-24T08:47:54.764128Z 1 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
  my_sql_db    | Database initialized
  my_sql_db    | MySQL init process in progress...
  my_sql_db    | 2018-08-24T08:47:58.970290Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
  my_sql_db    | 2018-08-24T08:47:58.970345Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
  my_sql_db    | 2018-08-24T08:47:58.974061Z 0 [Note] mysqld (mysqld 5.7.22-22) starting as process 58 ...
  my_sql_db    | 2018-08-24T08:47:58.999651Z 0 [Note] InnoDB: PUNCH HOLE support available
  my_sql_db    | 2018-08-24T08:47:58.999685Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
  my_sql_db    | 2018-08-24T08:47:58.999689Z 0 [Note] InnoDB: Uses event mutexes
  my_sql_db    | 2018-08-24T08:47:58.999692Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
  my_sql_db    | 2018-08-24T08:47:58.999695Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.8
  my_sql_db    | 2018-08-24T08:47:58.999698Z 0 [Note] InnoDB: Using Linux native AIO
  my_sql_db    | 2018-08-24T08:47:59.000153Z 0 [Note] InnoDB: Number of pools: 1
  my_sql_db    | 2018-08-24T08:47:59.000426Z 0 [Note] InnoDB: Using CPU crc32 instructions
  my_sql_db    | 2018-08-24T08:47:59.002306Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
  my_sql_db    | 2018-08-24T08:47:59.006893Z 0 [Note] InnoDB: Completed initialization of buffer pool
  my_sql_db    | 2018-08-24T08:47:59.013219Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
  my_sql_db    | 2018-08-24T08:47:59.024242Z 0 [Note] InnoDB: Crash recovery did not find the parallel doublewrite buffer at /var/lib/mysql/xb_doublewrite
  my_sql_db    | 2018-08-24T08:47:59.026263Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
  my_sql_db    | 2018-08-24T08:47:59.066469Z 0 [Note] InnoDB: Created parallel doublewrite buffer at /var/lib/mysql/xb_doublewrite, size 3932160 bytes
  my_sql_db    | 2018-08-24T08:47:59.071752Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
  my_sql_db    | 2018-08-24T08:47:59.072052Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
  my_sql_db    | 2018-08-24T08:47:59.422155Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
  my_sql_db    | 2018-08-24T08:47:59.423325Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
  my_sql_db    | 2018-08-24T08:47:59.423376Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
  my_sql_db    | 2018-08-24T08:47:59.423900Z 0 [Note] InnoDB: Waiting for purge to start
  my_sql_db    | 2018-08-24T08:47:59.474066Z 0 [Note] InnoDB: Percona XtraDB (http://www.percona.com) 5.7.22-22 started; log sequence number 2595255
  my_sql_db    | 2018-08-24T08:47:59.474647Z 0 [Note] Plugin 'FEDERATED' is disabled.
  my_sql_db    | 2018-08-24T08:47:59.499970Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
  my_sql_db    | 2018-08-24T08:47:59.500004Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
  my_sql_db    | 2018-08-24T08:47:59.500382Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
  my_sql_db    | 2018-08-24T08:47:59.501263Z 0 [Warning] CA certificate ca.pem is self signed.
  my_sql_db    | 2018-08-24T08:47:59.522151Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
  my_sql_db    | 2018-08-24T08:47:59.531657Z 0 [Note] InnoDB: Buffer pool(s) load completed at 180824  8:47:59
  </code></pre>
  
  <p>Looks like flyway starts before database initialization and hence could not connect to database and I see the error below.</p>
  
  <p>How can I fix that problem?</p>
  
  <h2>P.S.</h2>
  
  <p>I googled similar questions and I found the following piece of advice: <a href="https://github.com/vishnubob/wait-for-it" rel="noreferrer">https://github.com/vishnubob/wait-for-it</a> but I am novice in docker  and I don't understand how to put it into my docker compose file</p>
  
  <h2>P.S.2</h2>
  
  <p>I tried to put file <code>wait-fot-it.sh</code> near the compose file and execute:</p>
  
  <pre><code>command: ["./wait-for-it.sh", "mysql:3306", "--", "-url=jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false -user=root -password=password migrate"]
  </code></pre>
  
  <p>But I returns ERROR: <code>Invalid argument: ./wait-for-it.sh</code></p>
  
  <h2>P.S.3</h2>
  
  <p>I tried approach from "Duplicated" topic:</p>
  
  <pre><code>version: '3'
  services:
    my_sql_db:
      image: percona:latest
      container_name: my_sql_db
      environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: abhs
      ports:
      - "3306:3306"
      healthcheck:
        test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
        timeout: 20s
        retries: 10
    migration:
      image: boxfuse/flyway:latest
      container_name: flyway_migration
      volumes:
        - ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
      command: -url=jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false -user=root -password=password migrate
      depends_on:
        my_sql_db:
          condition: service_healthy
  </code></pre>
  
  <p>but I see following error:</p>
  
  <pre><code>$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up
  The Compose file '.\docker-compose-dev.yml' is invalid because:
  services.migration.depends_on contains an invalid type, it should be an array
  </code></pre>
  
  <h2>P.S.4</h2>
  
  <p>for that approach I see following error:</p>
  
  <pre><code>version: '3'
  services:
    my_sql_db:
      image: percona:latest
      container_name: my_sql_db
      environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: abhs
      ports:
      - "3306:3306"
      healthcheck:
        test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
        timeout: 20s
        retries: 10
    migration:
      image: boxfuse/flyway:latest
      container_name: flyway_migration
      volumes:
        - ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
      command: dockerize wait jdbc:mysql://my_sql_db:3306 -url=jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false -user=root -password=password migrate
      depends_on:
        - my_sql_db
  </code></pre>
  
  <p>I see following error:</p>
  
  <pre><code>flyway_migration  | ERROR: Invalid argument: dockerize
  </code></pre>
  
  <h2>UPDATE_1</h2>
  
  <p><strong>wait-for-it.sh</strong> content:</p>
  
  <pre><code>#!/usr/bin/env bash
  #   Use this script to test if a given TCP host/port are available
  
  cmdname=$(basename $0)
  
  echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1&gt;&amp;2; fi }
  
  usage()
  {
      cat &lt;&lt; USAGE &gt;&amp;2
  Usage:
      $cmdname host:port [-s] [-t timeout] [-- command args]
      -h HOST | --host=HOST       Host or IP under test
      -p PORT | --port=PORT       TCP port under test
                                  Alternatively, you specify the host and port as host:port
      -s | --strict               Only execute subcommand if the test succeeds
      -q | --quiet                Don't output any status messages
      -t TIMEOUT | --timeout=TIMEOUT
                                  Timeout in seconds, zero for no timeout
      -- COMMAND ARGS             Execute command with args after the test finishes
  USAGE
      exit 1
  }
  
  wait_for()
  {
      if [[ $TIMEOUT -gt 0 ]]; then
          echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT"
      else
          echoerr "$cmdname: waiting for $HOST:$PORT without a timeout"
      fi
      start_ts=$(date +%s)
      while :
      do
          if [[ $ISBUSY -eq 1 ]]; then
              nc -z $HOST $PORT
              result=$?
          else
              (echo &gt; /dev/tcp/$HOST/$PORT) &gt;/dev/null 2&gt;&amp;1
              result=$?
          fi
          if [[ $result -eq 0 ]]; then
              end_ts=$(date +%s)
              echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds"
              break
          fi
          sleep 1
      done
      return $result
  }
  
  wait_for_wrapper()
  {
      # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
      if [[ $QUIET -eq 1 ]]; then
          timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &amp;
      else
          timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT &amp;
      fi
      PID=$!
      trap "kill -INT -$PID" INT
      wait $PID
      RESULT=$?
      if [[ $RESULT -ne 0 ]]; then
          echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT"
      fi
      return $RESULT
  }
  
  # process arguments
  while [[ $# -gt 0 ]]
  do
      case "$1" in
          *:* )
          hostport=(${1//:/ })
          HOST=${hostport[0]}
          PORT=${hostport[1]}
          shift 1
          ;;
          --child)
          CHILD=1
          shift 1
          ;;
          -q | --quiet)
          QUIET=1
          shift 1
          ;;
          -s | --strict)
          STRICT=1
          shift 1
          ;;
          -h)
          HOST="$2"
          if [[ $HOST == "" ]]; then break; fi
          shift 2
          ;;
          --host=*)
          HOST="${1#*=}"
          shift 1
          ;;
          -p)
          PORT="$2"
          if [[ $PORT == "" ]]; then break; fi
          shift 2
          ;;
          --port=*)
          PORT="${1#*=}"
          shift 1
          ;;
          -t)
          TIMEOUT="$2"
          if [[ $TIMEOUT == "" ]]; then break; fi
          shift 2
          ;;
          --timeout=*)
          TIMEOUT="${1#*=}"
          shift 1
          ;;
          --)
          shift
          CLI=("$@")
          break
          ;;
          --help)
          usage
          ;;
          *)
          echoerr "Unknown argument: $1"
          usage
          ;;
      esac
  done
  
  if [[ "$HOST" == "" || "$PORT" == "" ]]; then
      echoerr "Error: you need to provide a host and port to test."
      usage
  fi
  
  TIMEOUT=${TIMEOUT:-15}
  STRICT=${STRICT:-0}
  CHILD=${CHILD:-0}
  QUIET=${QUIET:-0}
  
  # check to see if timeout is from busybox?
  # check to see if timeout is from busybox?
  TIMEOUT_PATH=$(realpath $(which timeout))
  if [[ $TIMEOUT_PATH =~ "busybox" ]]; then
          ISBUSY=1
          BUSYTIMEFLAG="-t"
  else
          ISBUSY=0
          BUSYTIMEFLAG=""
  fi
  
  if [[ $CHILD -gt 0 ]]; then
      wait_for
      RESULT=$?
      exit $RESULT
  else
      if [[ $TIMEOUT -gt 0 ]]; then
          wait_for_wrapper
          RESULT=$?
      else
          wait_for
          RESULT=$?
      fi
  fi
  
  if [[ $CLI != "" ]]; then
      if [[ $RESULT -ne 0 &amp;&amp; $STRICT -eq 1 ]]; then
          echoerr "$cmdname: strict mode, refusing to execute subprocess"
          exit $RESULT
      fi
      exec "${CLI[@]}"
  else
      exit $RESULT
  fi
  </code></pre>
  
  <h2>P.S.5</h2>
  
  <p>Also I tried this:</p>
  
  <pre><code>version: '3'
  services:
    my_sql_db:
      image: percona:latest
      container_name: my_sql_db
      environment:
        MYSQL_ROOT_PASSWORD: password
        MYSQL_DATABASE: abhs
      ports:
      - "3306:3306"
      healthcheck:
        test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
        timeout: 20s
        retries: 10
    migration:
      image: boxfuse/flyway:latest
      container_name: flyway_migration
      volumes:
       - ./flyway_scripts/src/main/resources/db/migration:/flyway/sql
      entrypoint: ["wait-for-it.sh", "mysql:3306", "--", "docker-entrypoint.sh"]      
      command: -url=jdbc:mysql://my_sql_db:3306/abhs?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false -user=root -password=password migrate
      depends_on:
        - my_sql_db
  </code></pre>
  
  <p>It leads to error:</p>
  
  <p>Creating flyway_migration ... error</p>
  
  <pre><code>ERROR: for flyway_migration  Cannot start service migration: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"wait-for-it.sh\": executable file not found in $PATH": unknown
  
  ERROR: for migration  Cannot start service migration: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"wait-for-it.sh\": executable file not found in $PATH": unknown
  Encountered errors while bringing up the project.
  </code></pre>