Как инициализировать postgres db с помощью flyway в докере? - PullRequest
0 голосов
/ 26 августа 2018

У меня есть приложение django, которое я пытаюсь разместить в докере.Мне не удалось запустить мой сервер postgres перед тем, как запустить приложение django.Вот мои docker-compose.yaml

version: '3'
services:
  flyway:
    image: boxfuse/flyway
    command: -url=jdbc:postgresql://db/dbname -schemas=schemaName -user=user -password=pwd migrate
    volumes:
      - ./flyway:/flyway/sql
    depends_on:
      - db
  db:
    image: postgres:9.6
    restart: always
    ports:
      - 5432:5432
    environment:
    - POSTGRES_PASSWORD=pwd
    healthcheck:
      test: "pg_isready -q -U postgres"
  app:
    image: myimage
    ports:
      - 8000:8000

Службы db и app, похоже, работают нормально, но я не могу раскрутить значения по умолчанию postgres с помощью пролетного пути.Вот ошибки, которые я получаю:

flyway_1  | SEVERE: Connection error: 
flyway_1  | org.postgresql.util.PSQLException: Connection to db:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

ERROR: 
flyway_1  | Unable to obtain connection from database (jdbc:postgresql://db/dbname) for user 'user': Connection to db:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

Я не смог найти хороший пример того, как использовать flyway с Postgres.Как мне заставить это работать?ТИА

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Версия '3+' файла docker-compose не поддерживает параметр condition в блоке depends_on, но версия '2.1+' поддерживает .Таким образом, вы можете создать составной файл, как показано ниже, который использует healthcheck из раздела postgres, например:

version: '2.1'

services:
  my-app:
#   ...  
#   ... 
    depends_on:
      - flyway

  flyway:
    image: boxfuse/flyway:5-alpine
    command: -url=jdbc:postgresql://postgres:5432/mydb -schemas=public -user=postgres -password=postgres migrate
    volumes:
      - ./migration:/flyway/sql
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    domainname: postgres
    build: ./migration
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    healthcheck:
      test: ["CMD", "pg_isready", "-q", "-U", "postgres"]
      interval: 5s
      timeout: 1s
      retries: 2
0 голосов
/ 30 августа 2018

Полагаю, причина в том, что depends_on службы flyway на самом деле не проверяет, работает ли база данных в db-контейнере, а проверяет, что контейнер работает. Это совсем другое - контейнер может быть запущен и запущен в тот момент, когда база данных внутри него запускается и еще не принимает соединение.

В таком случае вы должны указать проверку тепла, чтобы убедиться, что ваша база данных принимает подключения. Вы даже можете найти пример того, как это сделать с PostgreSQL, в официальных документах docker-compose .

...