Swift Vapor 3 + PostgreSQL + Docker-Compose Правильная конфигурация? - PullRequest
3 голосов
/ 03 апреля 2019

В настоящее время создается пакет для тестирования некоторых конфигураций devOps с AWS.Создание приложения с помощью Swift Vapor3, PostgreSQL 11, Docker.Учитывая мой github Repo , проект компилируется / тестируется / отлично работает с vapor build vapor test vapor run, учитывая, что у вас установлена ​​локальная установка postgresql с username: test, password: test

Однако мой API не подключается к моей БД, и я беспокоюсь, что моя конфигурация неверна.

version: "3.5"
services:
  api:
    container_name: vapor_it_container
    build:
      context: .
      dockerfile: web.Dockerfile
    image: api:dev
    networks:
      - vapor-it
    environment:
      POSTGRES_PASSWORD: 'test'
      POSTGRES_DB: 'test'
      POSTGRES_USER: 'test'
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
    ports:
      - 8080:8080
    volumes:
      - .:/app
    working_dir: /app
    stdin_open: true
    tty: true
    entrypoint: bash
    restart: always
    depends_on:
      - db

  db:
    container_name: postgres_container
    image: postgres:11.2-alpine
    restart: unless-stopped
    networks:
      - vapor-it
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: test
      POSTGRES_PASSWORD: test
      POSTGRES_HOST: db
      POSTGRES_PORT: 5432
      PGDATA: /var/lib/postgresql/data
    volumes:
      - database_data:/var/lib/postgresql/data

  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: test@test.com
      PGADMIN_DEFAULT_PASSWORD: admin
    volumes:
      - pgadmin:/root/.pgadmin
    ports:
      - "${PGADMIN_PORT:-5050}:80"
    networks:
      - vapor-it
    restart: unless-stopped

networks:
  vapor-it:
    driver: bridge

volumes:
  database_data:
  pgadmin:
  #  driver: local

Также, читая документы Docker postgres, я столкнулся с этим в разделе «Предостережения».

Если при запуске postgres в контейнере нет базы данных, postgres создаст для вас базу данных по умолчанию.Хотя это ожидаемое поведение postgres, это означает, что он не будет принимать входящие соединения в течение этого времени.Это может вызвать проблемы при использовании инструментов автоматизации, таких как docker-compose, которые запускают несколько контейнеров одновременно. postgres dockerhub

Я не внес эти изменения, потому что я не уверен, какчтобы сделать этот файл или как будет выглядеть конфигурация.Кто-нибудь сделал что-то подобное, что имеет некоторый опыт подключения к Postgresql и использования паров в качестве внутреннего интерфейса?

1 Ответ

2 голосов
/ 04 апреля 2019

Теория заключается в том, что хорошо ведущий себя контейнер должен уметь корректно обрабатывать, не запуская зависимости, потому что, несмотря на все усилия вашего планировщика контейнера, контейнеры могут приходить и уходить.Поэтому, если вашему приложению нужна БД, но в любой момент времени БД недоступна, она должна ответить рационально.Например, возврат 503 для HTTP-запроса или повторная попытка после задержки для запланированной задачи.

Хотя это теория и не всегда применима.В вашей ситуации, возможно, вам действительно нужно ваше приложение Vapor, чтобы дождаться появления Postgres, и в этом случае вы можете использовать скрипт-обертку, который опрашивает вашу БД и запускает ваше основное приложение только после того, как БД будет готова.

См. Этот предлагаемый скрипт-оболочку из документации Docker:

#!/bin/sh
# wait-for-postgres.sh

set -e

host="$1"
shift
cmd="$@"

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$host" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"
exec $cmd
command: ["./wait-for-postgres.sh", "db", "vapor-app", "run"]
...