You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions中Docker运行OpenSearch遇连接失败问题求助

解决GitHub Actions中OpenSearch连接失败问题

问题场景

需在代码推送(push)或拉取请求(pull request)触发的测试中,调用OpenSearch完成端到端测试,但无论是使用addnab/docker-run-action启动容器,还是GitHub Actions服务容器,均出现连接错误。

核心问题分析

  1. 服务未就绪:OpenSearch启动需要加载插件和初始化集群,直接执行curl请求时服务可能尚未就绪
  2. 网络访问方式错误:服务容器模式下,步骤容器与服务容器通过专用网络通信,需使用服务名而非localhost/0.0.0.0
  3. HTTPS协议未适配:OpenSearch默认启用HTTPS,未指定协议或跳过证书验证会导致连接失败
  4. 容器生命周期问题: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直接访问,无需账号密码

更优实现建议

  1. 固定镜像版本:避免使用latest标签,指定具体版本(如2.11.0),防止版本更新带来的兼容性问题
  2. 专业等待工具:Python测试中可使用wait-for-it脚本或opensearch-py库的内置等待方法,替代curl轮询
  3. 简化安全配置:测试环境无需安全验证时,禁用安全插件可大幅简化测试代码和配置

内容的提问来源于stack exchange,提问作者vibhor Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:35:08