【问题标题】:Swift Vapor 3 + PostgreSQL + Docker-Compose Correct configuration?Swift Vapor 3 + PostgreSQL + Docker-Compose 正确的配置?
【发布时间】:2019-08-25 07:44:45
【问题描述】:

目前正在构建一个包以使用 AWS 测试一些 devOps 配置。使用 Swift Vapor3、PostgreSQL 11、Docker 构建应用程序。鉴于我的github Repo 项目构建/测试/运行与vapor build vapor test vapor run 很好,因为您在本地安装了带有username: test, password: test 的postgresql

但是我的 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 和使用 vapor 作为后端方面有一些经验?

【问题讨论】:

    标签: postgresql docker docker-compose vapor


    【解决方案1】:

    理论上,一个表现良好的容器应该能够优雅地处理没有运行其依赖项的情况,因为尽管容器调度程序尽了最大努力,容器可能会来来去去。因此,如果您的应用需要数据库,但在任何给定时刻数据库不可用,它应该做出理性响应。例如,为 HTTP 请求返回 503,或在计划任务延迟后重试。

    不过,这是理论,并不总是适用。在您的情况下,也许您确实只需要您的 Vapor 应用程序等待 Postgres 可用,在这种情况下,您可以使用一个包装脚本来轮询您的数据库,并且仅在数据库准备好后启动您的主应用程序。

    See this suggested wrapper script from the Docker docs:

    #!/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"]
    

    【讨论】:

    • 我正在阅读有关将命令放在哪个部分的信息。这是在postgres服务下还是在api服务下。我已经用command: ["./wait-for-postgres.sh","db", "--","swift","run"] 试过了
    • 您将在还包含您的 Vapor API 的图像中构建脚本,并将其设置为该图像的命令/CMD。该脚本只是轮询 psql 直到它可用,然后执行作为参数传递的命令,该命令应该是 Vapor 二进制文件的路径和任何参数,例如 --hostname。
    • 我从我的 api 容器输出中得到的只是line 19: psql: command not found,无论它在 api 容器上运行多长时间。不过 postgres 容器已启动并正在运行。
    • 这只是意味着您的 API 容器没有安装 psql 二进制文件。我相信 Vapor 3 使用了纯 Swift Postgres 驱动程序,所以你现在不需要它。尝试将其添加到 API Dockerfile 的 apt-get 阶段。
    • 我想我觉得在我的 api 容器中下载 postgresql 只是为了看看它是否在另一个容器中可用很奇怪。我想现在的问题是从 localhost 访问我的 api,这是另一个问题。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2019-07-22
    • 2021-11-24
    • 2018-10-15
    • 2021-09-30
    相关资源
    最近更新 更多