FluentMySQL 迁移在使用 docker-compose 构建时失败,但在从 Xcode 构建时失败

分享于2023年05月08日 docker-compose fluent-mysql vapor 问答
【问题标题】:FluentMySQL migration fails when building with docker-compose but not when building from XcodeFluentMySQL 迁移在使用 docker-compose 构建时失败,但在从 Xcode 构建时失败
【发布时间】:2023-05-07 17:12:01
【问题描述】:

在将 docker-compose 与 Vapor 和 FluentMySQL 结合使用时,我遇到了以下崩溃。

api_1  | [ INFO ] Migrating 'mysql' database (/app/.build/checkouts/fluent/Sources/Fluent/Migration/MigrationConfig.swift:69)
    api_1  | Fatal error: Error raised at top level: NIO.ChannelError.connectFailed(NIO.NIOConnectionError(host: "db", port: 3309, dnsAError: nil, dnsAAAAError: nil, connectionErrors: [NIO.SingleConnectionFailure(target: [IPv4]db/172.27.0.2:3309, error: connection reset (error set): Connection refused (errno: 111))])): file /home/buildnode/jenkins/workspace/oss-swift-5.1-package-linux-ubuntu-18_04/swift/stdlib/public/core/ErrorType.swift, line 200

使用时迁移失败:

migrations.add(model: Model.self, database: .mysql)

如果我删除它,那么没有模型被迁移,应用程序构建不会出现错误,我可以通过 http://localhost/ 访问它。

我的 docker-compose.yml 看起来像这样:

version: "3.7"
services:
  api:
    image: vaporapiimage
    ports:
      - 80:8080
    environment:
      MYSQL_HOST: db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: dbname
      SLEEP_LENGTH: 7
      MYSQL_PORT: 3309
    depends_on:
        - db
  db:
    image: mysql:8.0.1
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: dbname
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3309:3306"

它按照预期从 Xcode 本地构建和运行(就像没有 Docker 一样)。

如果 api 服务被注释掉,那么 db 服务将自行运行并在首次运行时创建数据库。

任何帮助将不胜感激。

更新: 将 api 替换为Adminer 可以在浏览器中通过Adminer 访问 db 。所以 db 服务是可访问的,似乎问题出在 Vapor/Fluent(或者更确切地说是我对它们的使用):

  admin:
    image: adminer
    ports:
      - 8080:8080


【解决方案1】:

问题是我已将 db 的端口映射到 3309,这样它就不会与主机 MYSQL 冲突,但还将 ENV 'MYSQL_PORT' 设置为 3309,而应该将其保留为默认值 3306因为那是为了容器之间的通信。

【讨论】: