如何 运行 swagger-ui 本地代码更改和我自己的 swagger.json?

How to run swagger-ui with local code changes AND my own swagger.json?

https://github.com/swagger-api/swagger-ui 上的自述文件指定 Swagger-UI 可以 运行 与您自己的文件这样

docker run -p 80:8080 -e SWAGGER_JSON=/foo/swagger.json -v /bar:/foo swaggerapi/swagger-ui

如果我把它翻译成

docker build . -t swagger-ui-local && \
  docker run -p 80:8080 -e SWAGGER_JSON=/foo/my-file.json -v $PWD:/foo swagger-ui-local

但是,这会忽略我的本地更改。

我可以 运行 我的本地更改

npm run dev

但是除了 Petstore 示例之外,我不知道如何让这个开发服务器 运行 任何其他东西。

任何人都可以帮助我将两者结合起来,这样我就可以 运行 swagger-ui 本地代码更改和我自己的 swagger.json?

我想出了 npm run dev:

my-file.json 放入 dev-helpers 文件夹。然后可以从 http://localhost:3200/.

的搜索栏中找到它

要在打开服务器时自动加载它,请通过更改

来更改dev-helpers/index.html
url: "http://petstore.swagger.io/v2/swagger.json"

url: "my-file.json"

以防万一您运行使用 Play Framework 创建 Maven 项目,以下步骤解决了我的问题:

1.) 修改 conf/routes 文件。添加以下行: GET /swagger.json controllers.Assets.at(path="/public/swagger-ui",file="swagger.json")

2.) 将 swagger.json 文件添加到您的 Swagger-UI 文件夹

所以当你运行端口示例7777中的mvn项目,使用mvn play2:run启动播放服务器然后,localhost:7777/docs会自动拉取Json 本地添加的文件。

确保您正在卷挂载正确的本地目录。

在本地,我在 $PWD/src/app/swagger/swagger.yaml 中进行了 swagger 配置。 运行 以下工作正常:

docker run -p 80:8080 -e SWAGGER_JSON=/tmp/swagger.yaml -v `pwd`/src/app/swagger:/tmp swaggerapi/swagger-ui

只需刷新 Swagger-UI 页面或单击 header 中的“浏览”按钮即可触发刷新我的 YAML 文件中的数据。

您还可以指定 BASE_URL 摘自 swagger-installation

docker run -p 80:8080 -e BASE_URL=/swagger -e SWAGGER_JSON=/foo/swagger.json -v /bar:/foo swaggerapi/swagger-ui

我找到这个主题是因为我想查看本地 swagger 文件的可视化表示,但似乎无法获得 swagger-ui(运行 in docker)显示宠物店以外的任何内容。

最终,我的问题是理解 -e SWAGGER_JSON 和 -v 标志,所以我想在这里解释一下。

-v <path1>:<path2>

这个选项表示 "Mount the path <path1> from my local file system within the swagger-ui docker container on path <path2>"

-e SWAGGER_JSON=<filepath>

这个选项说 "By default, show the swagger for the file at <filepath> using the docker container's file system." 这里的重要部分是这个文件路径应该考虑到你如何设置上面的

综合起来,我得到了以下结果:

docker run -p 8085:8080 -e SWAGGER_JSON=/foo/swagger.json -v `pwd`:/foo swaggerapi/swagger-ui

这是英文的:"Run my swagger-ui instance on port 8085. Mount my current working directory as '/foo' in the docker container. By default, show the swagger file at '/foo/swagger.json'."

需要注意的重要一点是,我的当前工作目录中有一个名为 swagger.json 的文件。此命令将我当前的工作目录挂载为 docker 容器中的 /foo。然后,大摇大摆的UI可以把我的swagger.json捡起来当/foo/swagger.json.

这是我最终解决这个问题的方法,它还允许您拥有多个 YML 文件:

docker run -p 80:8080 \                                                                                                                                 
  -e URLS_PRIMARY_NAME=FIRST \                                                                                                                             
  -e URLS="[ \                                                                                                                                           
    { url: 'docs/first.yml', name: 'FIRST' } \                                                                                                               
    , { url: 'docs/second.yml', name: 'SECOND' } \                                                                                                             
  ]" \                                                                                                                                                   
  -v `pwd`:/usr/share/nginx/html/docs/ \                                                                                                                 
  swaggerapi/swagger-ui   

Docker 编写解决方案:

创建 .env 文件并添加以下内容:

URLS_PRIMARY_NAME=FIRST
URLS=[ { url: 'docs/swagger.yaml', name: 'FIRST' } ]

并创建一个 docker-compose 文件,内容如下:

version: "3.3"

services:
 swagger-ui:
  image: swaggerapi/swagger-ui
  container_name: "swagger-ui"
  ports:
    - "80:8080"
  volumes:
   - /local/tmp:/usr/share/nginx/html/docs/
  environment:
    - URLS_PRIMARY_NAME=${URLS_PRIMARY_NAME}
    - URLS=${URLS}

swagger.yaml 在 /local/tmp。

对于 mac 中遇到此问题的人来说,这是一个权限问题。在 Catalina 之后默认情况下,docker 没有权限允许其图像读取您系统中的本地文件。一旦给出它对我有用,它就占用了我当地的 swagger json 文件。

现在要授予权限,请转到系统偏好设置> 安全和隐私> 文件和文件夹,然后为 Mac 和您的共享目录添加 Docker。

如果您想提供多个 URL 并来自特定文件夹(非默认 /usr/share/nginx/html/docs/)的另一种解决方案:

docker run -p 80:8080 \
    -e SWAGGER_JSON=/docs/api.yaml \
    -e URLS="[ \
        { url: '/api1.yaml', name: 'API 1' }, \
        { url: '/api2.yaml', name: 'API 2' } \
    ]" \
    -v `pwd`/docs:/docs \
    swaggerapi/swagger-ui

或 docker 撰写:

version: '3.8'
services:
  swagger-ui:
    image: swaggerapi/swagger-ui
    volumes:
      - ./docs:/docs
    environment:
      SWAGGER_JSON: /docs/api.yaml
      URLS: '[{ url: "/api1.yaml", name: "API 1" }, { url: "/api2.yaml", name: "API 2" }]'

请注意,SWAGGER_JSON 需要绝对路径,URLS 中的 URL 需要来自指定卷的相对路径