GitLab Runner 启动tomcat镜像时,curl接口报错

我自行打包了一个tomcat image,并在runner成功启动,但是curl接口的时候报错localhost port 8080
遇到这个问题的时候,我第一时间想到了是否是容器内部无法连接,我进行了sleep,并进入了容器。然而在runner生成的容器中,我能够去正常的curl接口,并能够成功返回200。
请问这个问题是如何产生,怎么解决呢

你这里的curl无法连接指的是从其他机器curl容器里暴露的接口吗?

与runner在一个docker上
curl的东西是runner启动images中的tomcat中写好的接口
容器内部是可以连接的,但是从gitlab的作业中是失败的
我在runner启动容器后进行了sleep操作,去手动curl接口,这个是成功的。

你容器里的端口有暴露到docker主机上吗?

runner应该是生成一个容器,然后在容器内部跑相应的命令,我并不需要从外部docker访问我的容器。
我单独run image的时候 8080端口是能够正常访问的

你这个地方的意思是不是,让runner启动两个容器,一个容器是tomcat镜像,另外一个容器里curl 这个tomcat容器里的8080端口?

不是 我同一个容器里面 tomcat自己curl自己,网页上runner黑窗口不行,我自己先sleep掉,去手动curl是可以的。

这里需要看一下你的tomcat容器Dockerfile里的CMD或者EntryPoint后面跟的命令是什么?它这个服务起来以后是否可以稳定存在?因为你使用sleep的话,容器后台服务是可以稳定运行的。如果你没有加sleep或者其他方式让tomcat服务稳定运行,那么tomcat镜像启动容器后,容器马上就因为命令执行结束,就自动停止了。这个时候去curl它,对应的端口自然就访问不了。

因为我是用yml里面的image标签做镜像启动,这个我也能够控制么?
我的镜像时我自己commit,然后push到gitlab的镜像库中,
在yml中使用images标签去运行启动他,这个时候我是需要用service标签么,还是利用其他方式?

我试了很多次
在同一个容器中操作命令是不会停止的。
我已经用命令在yml中启动tomcat并curl,这并不会使tomcat停止。
所以我觉得这个还是个问题。

可以使用service标签将它启动为一个服务。

启用了服务 我当前阶段的script就不能用了,然后下一个阶段的curl 就使用了docker镜像,然后导致没有curl这个命令

能把你.gitlab-ci.yml文件贴一下吗,我这边还没太理解你的目的。

stages:
  - build
  - test
#  - deploy

build-job:  
  stage: build
#  image:
#   name: registry.jihulab.com/ygggf/sec-test-docker:v1
#   entrypoint: ["startup.sh"]
#  services:
#  - name: registry.jihulab.com/ygggf/sec-test-docker:v1
#    entrypoint: ["startup.sh"]
# image: report:v1
  script:
    - echo "Compiling the code..."
    - echo "Compile complete."
    - echo $CI_REGISTRY_IMAGE
#registry.jihulab.com/ygggf/sec-test-docker
#  - pwd
#  - cd /
#  - ls
#  - cd /usr/local/tomcat/bin
#  - ./startup.sh
#  - ./catalina.sh run
    - curl http://localhost:8080/fortify/report/health-check

registry.jihulab.com/ygggf/sec-test-docker:v1
这个image里面其实是一个tomcat加一个我们自己的war包

image 不是被 # 注释掉的么。

另外,tomcat 启动也需要时间,执行 curl 的时候可能 tomcat 还没启动起来。

所以,执行 curl 之前,是不是得写个 while 检测一下端口?

2 个赞

我while检测一下端口吧

我注释的原因是 我在使用shell调试

感谢大佬的解答,确实是tomcat没有及时启动导致的