首页 > 解决方案 > 不依赖于特定 URL 的 Docker-compose swagger-ui 设置

问题描述

我想将 swagger-ui 添加到我的 docker-compose 设置中。我正在使用 postgres 和postgrest。我的设置大致如下:

version: '3'
services:

  postgrest:
    image: postgrest/postgrest
    ports:
      - 3000:3000
    links:
      - postgres         

  postgres:
    image: postgres
    ports:
      - 5432:5432
    volumes:
      - "./pgdata:/var/lib/postgresql/data"

  swagger:
    image: swaggerapi/swagger-ui
    expose:
      - 8080
    ports:
      - 8080:8080
    links:
      - postgrest:postgrest
    environment:
      API_URL: http://localhost:3000

当我在本地进行测试时,这向我展示了正确的 API 文档 UI。当我部署时,http://localhost:3000不再提供 OpenAPI 定义,这会中断。我可以将 API_URL 更改为远程 URL,但是如果我正在测试一些更改,它将不会在本地更新,而且这通常似乎与这一点无关。

有没有办法大摇大摆地指出“在同一个 docker compose 设置中运行的 postgrest”?就像是:

  swagger:
    ...
    links:
      - postgrest:postgrest
    environment:
      API_URL: http://postgrest:3000

有时 docker compose 可以做这样的魔术,例如在 nginx 中。

提前致谢!

标签: dockerdocker-composeswaggerswagger-uipostgrest

解决方案


尽管您在 中设置了API_URLdocker-compose.yml但我相信获取规范文件的实际请求是由浏览器完成的。

因此,您的浏览器应该能够解析该 URL,而不是 swagger-ui 容器本身。

此外,既然是这种情况,您根本不需要托管远程 Swagger UI。只需运行一个单独的 swagger-ui 本地容器,并在需要时在 UI 本身中将 URL 更改为 swagger 文件。

更新:使用SWAGGER_JSON

version: "3"
services:
  postgrest:
    image: postgrest/postgrest
    ports:
      - 3000:3000
    environment:
      PGRST_DB_URI: postgres://app_user:password@postgres:5432/app_db
      PGRST_DB_SCHEMA: public
      PGRST_DB_ANON_ROLE: app_user
    depends_on:
      - postgres

  postgres:
    image: postgres
    ports:
      - 5435:5432
    environment:
      POSTGRES_DB: app_db
      POSTGRES_USER: app_user
      POSTGRES_PASSWORD: password
    volumes:
      - "./pgdata:/var/lib/postgresql/data"

  save-swagger:
    image: busybox
    depends_on:
      - postgrest
    volumes:
      - swagger-json:/spec
    command: >
      /bin/sh -c "sleep 15
      && mkdir -p /spec
      && wget -O /spec/swagger.json http://postgrest:3000"

  swagger:
    image: swaggerapi/swagger-ui
    expose:
      - 8080
    ports:
      - 8029:8080
    links:
      - postgrest:postgrest
    environment:
      SWAGGER_JSON: /spec/swagger.json
    volumes:
      - swagger-json:/spec

volumes:
  swagger-json:

请注意,使用sleep不是最好的方法。您可以查看更好的选项,例如使用wait-on / wait-for / wait-for-it

PS:我已经尝试过wait-for& wait-for-it,但是由于postgrest它的端点可用,即使与数据库的连接不成功,它也会响应 a503并且这两个工具都只是检查 TCP 套接字的可用性,所以这里不能按预期工作.
wait-on可以工作,因为它会检查2xxHEAD 请求,但你需要一个带有 nodejs 的容器,所以我坚持sleep作为必须做的最简单的例子。:)


推荐阅读