docker - 不依赖于特定 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 中。
提前致谢!
解决方案
尽管您在 中设置了API_URL
,docker-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
可以工作,因为它会检查2xx
HEAD 请求,但你需要一个带有 nodejs 的容器,所以我坚持sleep
作为必须做的最简单的例子。:)
推荐阅读
- javascript - 弹出窗口总是显示相同的数据
- android - 为什么当我的应用程序关闭时我没有收到 FCM 通知?
- xml - 在 xquery 中根据输出是否格式正确使用 fn:parse-xml()
- kubernetes - Kubernetes 集群 v1.19.4 中处于待处理状态的 Coredns
- c# - 如果功能由按钮触发,WPF 绑定不起作用
- javascript - 反应:TypeError:无法读取 null 的属性“菜”
- android - 作为吗?在 if 语句中确保块内的实例在所有 if 块内都不为空?
- python - 在 Pyspark Dataframes 上左连接和应用案例逻辑
- arrays - p / primes[i] >= primes[i] 背后的逻辑,同时使用数组查找素数
- flask - @app.before_request 中的 Flask 重定向调用会破坏所有 .css 和 .js