GitLab Pipeline运行ECR中Oracle服务镜像出现健康检查错误如何解决
问题根因
这个报错和GitLab Runner Docker执行器的默认健康检查逻辑有关:
GitLab Runner启动服务容器后,会自动拉起wait-for-service容器检测服务是否就绪,要求服务镜像必须在Dockerfile中通过EXPOSE指令声明暴露的端口,否则健康检查逻辑就会抛出No HOST or PORT found错误。你本地直接执行docker run可以正常启动,是因为Docker默认不会强制执行这个健康检查逻辑,不影响容器本身运行。
修复方案
你可以直接修改gitlab-ci.yml配置,为Oracle服务显式指定健康检查规则,跳过自动端口检测逻辑,参考配置如下:
test: stage: test image: ***.dkr.ecr.us-east-2.amazonaws.com/project:latest services: - name: ***.dkr.ecr.us-east-2.amazonaws.com/oracle-db:latest alias: oracleDB # 显式配置健康检查,Oracle默认监听1521端口 healthcheck: test: ["CMD", "bash", "-c", "echo > /dev/tcp/localhost/1521"] interval: 10s timeout: 5s retries: 10 tags: - [runner] # 可配置全局变量,方便项目代码直接读取Oracle连接信息 variables: ORACLE_HOST: oracleDB ORACLE_PORT: 1521
如果不想修改CI配置,也可以调整对应GitLab Runner的config.toml文件,在[runners.docker]配置块中添加health_check = false,关闭该Runner的服务自动健康检查逻辑即可。
其他多容器网络连通方案
如果不想用GitLab CI自带的services能力,也可以用以下方式实现两个镜像同时运行、网络互通:
- 使用docker-compose:在CI任务脚本中安装docker-compose,编写compose配置文件同时定义项目容器和Oracle容器,同一个compose栈内的容器默认处于同一网络,可以直接用服务名互相访问。
- 手动管理Docker网络:在CI脚本中先执行
docker network create创建自定义桥接网络,再分别启动两个容器并加入该网络,启动时指定容器名后,就可以直接用容器名作为域名互相访问。
内容的提问来源于stack exchange,提问作者galgal
相关产品推荐
相关产品推荐

