如何解决GitLab CI中多个需开放相同端口的服务的端口冲突问题
解决方案
- 利用Docker端口映射规则规避冲突:容器内部监听的端口无需修改,仅在启动容器时通过
-p参数将两个容器的同个内部端口映射到宿主机不同端口即可。例如两个容器内部均监听8080端口,启动时分别执行docker run -p 18080:8080 镜像A和docker run -p 28080:8080 镜像B,两套测试套件分别请求宿主机的18080和28080端口即可访问对应服务,全程不需要修改程序代码。 - 基于Docker自定义网络实现容器间直接通信:创建独立的Docker桥接网络,将两个服务容器都加入该网络。两个容器即使内部监听端口一致也不会产生冲突,测试程序和服务同属一个网络时,直接通过「容器名:内部端口」的格式即可访问对应服务,不需要将端口暴露到宿主机,从根源避免端口冲突。
- 适配GitLab CI的services配置规则:如果你的自动化测试是在GitLab CI流水线中运行,可直接在
.gitlab-ci.yml的services字段下配置两个镜像,分别设置不同的别名即可。示例配置如下:
test: services: - name: registry.gitlab.com/你的项目/镜像v1:latest alias: service-v1 - name: registry.gitlab.com/你的项目/镜像v2:latest alias: service-v2 script: - 运行测试套件1,请求地址为http://service-v1:内部端口 - 运行测试套件2,请求地址为http://service-v2:内部端口
GitLab CI会自动为所有服务和测试任务创建专用网络,不同别名的服务即使内部端口相同也不会互相干扰,不需要做任何额外的端口配置。
内容的提问来源于stack exchange,提问作者Iustinian Olaru
相关产品推荐
相关产品推荐

