FluentMySQL 迁移在使用 docker-compose 构建时失败,但在从 Xcode 构建时失败
FluentMySQL migration fails when building with docker-compose but not when building from Xcode
我在使用 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 构建和 运行s(与没有 Docker 时一样)。
如果 api
服务被注释掉,那么 db
服务将 运行 自行创建数据库 运行。
如有任何帮助,我们将不胜感激。
更新:
将 api
替换为 Adminer 会导致能够通过浏览器中的 Adminer 访问 db
。所以 db
服务是可以访问的,似乎问题出在 Vapor/Fluent (或者更确切地说是我对它们的使用):
admin:
image: adminer
ports:
- 8080:8080
问题是我已将 db
的端口映射到 3309,这样它就不会与主机 MYSQL 冲突,但还将 ENV 'MYSQL_PORT' 设置为 3309当它应该保留为默认值 3306 时,因为它用于容器之间的通信。
我在使用 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 构建和 运行s(与没有 Docker 时一样)。
如果 api
服务被注释掉,那么 db
服务将 运行 自行创建数据库 运行。
如有任何帮助,我们将不胜感激。
更新:
将 api
替换为 Adminer 会导致能够通过浏览器中的 Adminer 访问 db
。所以 db
服务是可以访问的,似乎问题出在 Vapor/Fluent (或者更确切地说是我对它们的使用):
admin:
image: adminer
ports:
- 8080:8080
问题是我已将 db
的端口映射到 3309,这样它就不会与主机 MYSQL 冲突,但还将 ENV 'MYSQL_PORT' 设置为 3309当它应该保留为默认值 3306 时,因为它用于容器之间的通信。