gan*_*404 8 gitlab gitlab-ci docker-compose devops
我有一个使用硒的项目,用于前端应用程序和后端testng的集成测试。因此,为了运行测试,我首先需要启动所有依赖项目:vuejsspringboot
每个项目都在自己的存储库中。所以我创建了 springboot 和前端应用程序的 docker 映像,并将其放在gitlab container registry. 然后在testeng项目中计划使用docker-compose中的.gitlab-ci.yml. 这是docker-compose.ymltestng 项目:
version: '3.7'
services:
  frontendapp:
    image: demo.app-frontend-selenium
    container_name: frontend-app-selenium
    depends_on:
      - demoapi
    ports:
      - 8080:80
  demoapi:
    image: demo.app-backend-selenium
    container_name: demo-api-selenium
    depends_on:
      - mongodb
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SCOUNT_API_ENDPOINTS_WEB_CORS_OPTIONS_ALLOWEDORIGINS=*
      - SPRING_DATA_MONGODB_HOST=mongodb
      - SPRING_DATA_MONGODB_DATABASE=demo-api-selenium
      - KEYCLOAK_AUTH-SERVER-URL=https://my-keycloak-url/auth
    ports:
      - 8082:80
  mongodb:
    image: mongo:4-bionic
    container_name: mongodb-selenium
    environment:
      MONGO_INITDB_DATABASE: demo-api-selenium
    ports:
      - 27017:27017
    volumes:
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
在 gitlab-ci.yml 中运行 docker-compose 后,为了执行测试,前端应用程序的 url 是什么?当我在本地执行此操作时,我使用以下网址进行测试:
但是,如果在 gitlab ci 上运行时,访问前端和 api 的 url 是什么?
TL;DR 而不是使用localhost您需要使用 docker 守护进程 ( docker:dind) 服务的主机名。如果您按照常规设置为 GitLab 作业设置 docker-in-docker,那么这很可能是docker.
因此,根据您的撰写文件,您需要使用的网址是:
http://docker:8080http://docker:8082my_job:
  services:
    - name: docker:dind
      alias: docker  # this is the hostname of the daemon
  variables:
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: "tcp://docker:2375"
  image: docker:stable
  script:
    - docker run -d -p 8000:80 strm/helloworld-http
    - apk update && apk add curl # install curl and let server start
    - curl http://docker:8000 # use the daemon to reach your containers
有关此内容的完整解释,请继续阅读。
通常,当您在系统上docker-compose 本地使用时,您通常会在本地主机上运行 docker 守护程序(例如使用 docker 桌面)。
当您提供端口映射时,8080:80这意味着在绑定到容器中端口 80 的守护程序主机上发布端口 8080。在本地运行时,这意味着您可以通过 访问容器localhost。
但是,当您在GitLab CI上运行 docker-in-docker 时,此环境中的重要区别在于docker 守护进程是远程的。因此,当您通过 docker API 公开端口时,这些端口会在 docker 守护进程主机上公开,而不是在作业容器本地公开。
因此,您必须使用 docker 守护进程的主机名(而不是localhost)来访问已启动的容器。
另一种方法是在使用 compose 堆栈创建的同一 docker 网络内进行测试。这样,您的测试就与 docker 环境所在的位置无关,并且可以利用 compose 文件中的服务别名(如frontendapp、demoapi等),而不是依赖已发布的端口。
例如,您可以选择将测试容器添加到您的撰写堆栈中。一些测试库(例如Testcontainers)也可以帮助设置此功能。
| 归档时间: | 
 | 
| 查看次数: | 560 次 | 
| 最近记录: |