Docker-compose swagger-ui, который не зависит от конкретного URL - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу добавить 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 документации, когда я тестирую локально. При развертывании http://localhost:3000 больше не обслуживает определение OpenAPI, и это ломается. Я могу изменить API_URL на удаленный URL-адрес, но тогда он не будет обновляться локально, если я тестирую некоторые изменения, и это, как правило, в любом случае побеждает точку.

Есть ли способ указать сваггеру на "postgrest, работающий в той же настройке составления докера"? Что-то вроде:

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

Иногда docker compose может творить магию, например, например. в nginx.

Заранее спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Несмотря на то, что вы установили API_URL в своем docker-compose.yml, фактический запрос на получение файла спецификации выполняется браузером.

Итак, ваш браузер должен разрешать этот URL, а не сам контейнер swagger-ui.

Кроме того, поскольку это так, вам вообще не нужен удаленный интерфейс Swagger, размещенный вообще. Просто запустите отдельный локальный контейнер swagger-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 не лучший подход. Вы можете проверить лучшие варианты, такие как ожидание / ожидание / ожидание его

PS: я пробовал wait-for & wait-for-it, но, поскольку postgrest имеет свою конечную точку, доступную даже при том, что соединение с БД не было успешным, оно отвечало 503, и оба эти утилиты просто проверьте доступность сокета TCP, поэтому не работайте так, как ожидалось.
wait-on будет работать, так как он проверяет 2xx для запросов HEAD, но вам понадобится контейнер с nodejs, поэтому я остановился на sleep в качестве простейшего примера того, что нужно сделать. :)

...