GitHub Actions中Docker运行OpenSearch遇连接失败问题求助
解决GitHub Actions中OpenSearch连接失败问题
问题场景
需在代码推送(push)或拉取请求(pull request)触发的测试中,调用OpenSearch完成端到端测试,但无论是使用addnab/docker-run-action启动容器,还是GitHub Actions服务容器,均出现连接错误。
核心问题分析
- 服务未就绪:OpenSearch启动需要加载插件和初始化集群,直接执行curl请求时服务可能尚未就绪
- 网络访问方式错误:服务容器模式下,步骤容器与服务容器通过专用网络通信,需使用服务名而非
localhost/0.0.0.0 - HTTPS协议未适配:OpenSearch默认启用HTTPS,未指定协议或跳过证书验证会导致连接失败
- 容器生命周期问题:
docker-run-action未后台运行容器时,步骤结束后容器会被销毁
修复方案1:调整docker-run-action配置
通过后台运行容器、添加等待逻辑适配服务启动时间,同时使用HTTPS访问:
- name: Setup opensearch uses: addnab/docker-run-action@v3 with: image: opensearchproject/opensearch:latest options: --detach -p 9200:9200 -p 9600:9600 -e OPENSEARCH_INITIAL_ADMIN_PASSWORD=bgnYFGR2RhN3SCX -e "discovery.type=single-node" - name: Wait for OpenSearch to be ready run: | until curl -s -k -u admin:bgnYFGR2RhN3SCX https://localhost:9200/_cluster/health | grep -q '"status":"green"' || grep -q '"status":"yellow"'; do echo "Waiting for OpenSearch..." sleep 5 done - name: Test opensearch run: curl -X GET "https://localhost:9200" -k -u admin:bgnYFGR2RhN3SCX
关键调整:
- 添加
--detach参数让容器后台运行 - 等待脚本轮询集群健康状态,直到服务就绪
- 使用
https协议并通过-k跳过自签名证书验证
修复方案2:服务容器模式(推荐)
GitHub Actions服务容器是官方推荐的依赖服务管理方式,调整后配置如下:
name: Run Lint and Unit Test on PR on: push: branches: - main pull_request: jobs: run-lint-and-unit-tests: name: Run Lint and Unit Tests and Coverage runs-on: ubuntu-latest services: opensearch: image: opensearchproject/opensearch:latest env: OPENSEARCH_INITIAL_ADMIN_PASSWORD: bgnYFGR2RhN3SCX discovery.type: single-node # 可选:测试无需安全验证时,禁用安全插件简化配置 # plugins.security.disabled: "true" ports: - 9200:9200 - 9600:9600 steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python 3.12 uses: actions/setup-python@v5 with: python-version: '3.12' cache: 'pip' - name: Wait for OpenSearch to be ready run: | until curl -s -k -u admin:bgnYFGR2RhN3SCX https://opensearch:9200/_cluster/health | grep -q '"status":"green"' || grep -q '"status":"yellow"'; do echo "Waiting for OpenSearch..." sleep 5 done - name: Test opensearch run: curl -X GET "https://opensearch:9200" -k -u admin:bgnYFGR2RhN3SCX
关键调整:
- 使用服务名
opensearch作为主机名(服务容器间通过服务名通信) - 保留HTTPS访问并跳过证书验证
- 添加等待脚本确保服务完全启动后执行测试
- 可选:禁用安全插件后,可使用
http://opensearch:9200直接访问,无需账号密码
更优实现建议
- 固定镜像版本:避免使用
latest标签,指定具体版本(如2.11.0),防止版本更新带来的兼容性问题 - 专业等待工具:Python测试中可使用
wait-for-it脚本或opensearch-py库的内置等待方法,替代curl轮询 - 简化安全配置:测试环境无需安全验证时,禁用安全插件可大幅简化测试代码和配置
内容的提问来源于stack exchange,提问作者vibhor Gupta
相关产品推荐
相关产品推荐

