mongodb - GitHub 操作无法连接到 MongoDB 服务
问题描述
我在使用 GitHub 操作运行自动化测试时遇到问题。我无法弄清楚为什么我无法连接运行我的集成测试的 MongoDB 服务。我尝试了不同的主机:localhost、127.0.0.1、0.0.0.0,但它们都无法连接到数据库。
它在我的 docker 设置中运行良好,但由于某种原因不适用于 GitHub 操作。
name: CI master
on: [push, pull_request]
env:
RUST_BACKTRACE: 1
CARGO_TERM_COLOR: always
APP_ENV: development
APP_MONGO_USER: test
APP_MONGO_PASS: password
APP_MONGO_DB: test
jobs:
# Run tests
test:
name: Test
runs-on: ubuntu-latest
services:
mongo:
image: mongo
env:
MONGO_INITDB_ROOT_USERNAME: ${APP_MONGO_USER}
MONGO_INITDB_ROOT_PASSWORD: ${APP_MONGO_PASS}
MONGO_INITDB_DATABASE: ${APP_MONGO_DB}
ports:
- 27017:27017
steps:
- uses: actions/checkout@v2
- uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: stable
override: true
- uses: actions-rs/cargo@v1
with:
command: test
配置文件(development.toml)。
[application]
host = "127.0.0.1"
port = 8080
连接到数据库。环境变量和配置文件被合并,我在这里通过 config: &Settings 访问它们。
pub async fn init(config: &Settings) -> Result<Database> {
let client_options = ClientOptions::parse(
format!(
"mongodb://{}:{}@{}:27017",
config.mongo.user, config.mongo.pass, config.application.host
)
.as_str(),
)
.await?;
let client = Client::with_options(client_options)?;
let database = client.database("test"); // TODO: replace with env var
database.run_command(doc! {"ping": 1}, None).await?;
println!("Connected successfully.");
Ok(database)
}
调用初始化函数。
// Mongo
let mongo = mongo::init(&config).await.expect("Failed to init mongo");
我得到的错误。
thread 'health_check' panicked at 'Failed to init mongo: Error { kind: ServerSelectionError { message: "Server selection timeout: No available servers. Topology: { Type: Unknown, Servers: [ { Address: 127.0.0.1:27017, Type: Unknown, Error: Connection refused (os error 111) }, ] }" }, labels: [] }', tests/health_check.rs:31:44
解决方案
我最终通过在我的服务中添加健康检查来解决它。似乎我的问题与我的数据库在运行测试之前尚未启动有关。
services:
mongodb:
image: mongo
env:
MONGO_INITDB_ROOT_USERNAME: test
MONGO_INITDB_ROOT_PASSWORD: password
MONGO_INITDB_DATABASE: test
options: >-
--health-cmd mongo
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 27017:27017
推荐阅读
- django - NameError:名称“CityForm”未定义
- asp.net-core - Web Farm 上的 ASP.NET Core 数据保护
- c++ - 如何在焦点链中添加复选框(QCheckBox)
- node.js - 您如何在 Heroku 应用程序上快速工作?
- sap-successfactors - SuccessFactors 的身份验证并获取所有实体
- rust - 为什么动态闭包(作为特征对象的闭包)在放置 Rc 后变得不可用
>? - xaml - 将第一个元素设置为 x:Null(一个 Xaml 问题)
- python - 如何在 Django 的项目文件夹中创建数据库?
- vue.js - 在 Vue 中过滤嵌套循环
- mysql - SQL - 在 FIND_IN_SET 函数中使用变量时“非法混合排序规则”