Почему Достижимость выбирает останов приложения здесь?

PORTS
0.0.0.0:4466->4466/tcp
5432/tcp

Если вы проверите столбец портов команды docker ps, вы поймете, что порт Postgres не доступен для использования на хост-машине.

Чтобы решить эту проблему, вам необходимо добавить в файл docker-compose.yml следующее:

ports:
  - "5432:5432"

Чтобы весь файл выглядел следующим образом:

version: '3'
services:
  prisma:
    image: prismagraphql/prisma:1.30-alpha
    restart: always
    ports:
    - "4466:4466"
    environment:
      PRISMA_CONFIG: |
        port: 4466
        # uncomment the next line and provide the env var PRISMA_MANAGEMENT_API_SECRET=my-secret to activate cluster security
        # managementApiSecret: my-secret
        prototype: true
        databases:
          default:
            connector: postgres
            host: postgres
            user: prisma
            password: prisma
            port: 5432
  postgres:
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: prisma
      POSTGRES_PASSWORD: prisma
    volumes:
      - postgres:/var/lib/postgresql/data
volumes:
  postgres:

и затем вам нужно запустить docker-compose up -d, чтобы применить новые изменения. При правильной настройке столбец PORTS в docker ps должен выглядеть следующим образом

PORTS
0.0.0.0:4466->4466/tcp
0.0.0.0:5432->5432/tcp
5
задан 4thSpace 6 April 2009 в 22:14
поделиться

1 ответ

Отвечать на Ваш вопрос непосредственно, нет, там, кажется, не способ "обойти" SCNetworkReachabilityGetFlags () занимающий много времени для возврата при определенных обстоятельствах, которые Вы описали (например, проверив удаленную достижимость хоста через соединение WiFi с маршрутизатором без Интернета). Несколько опций:

ОПЦИЯ 1. Выполните вызов в отдельном потоке так, чтобы остальная часть Вашего приложения могла продолжать бежать. Измените ReachabilityAppDelegate.m следующим образом для примера:

// Modified version of existing "updateStatus" method
- (void)updateStatus
{
    // Query the SystemConfiguration framework for the state of the device's network connections.
    //self.remoteHostStatus           = [[Reachability sharedReachability] remoteHostStatus];
    self.remoteHostStatus = -1;
    self.internetConnectionStatus   = [[Reachability sharedReachability] internetConnectionStatus];
    self.localWiFiConnectionStatus  = [[Reachability sharedReachability] localWiFiConnectionStatus];
    [tableView reloadData];

    // Check remote host status in a separate thread so that the UI won't hang
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(updateRemoteHostStatus) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
    [pool release];
}
// New method
- (void) updateRemoteHostStatus
{
    self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
    [tableView reloadData];
}

ОПЦИЯ 2. Используйте другой API/функцию, который использует значение тайм-аута при попытке соединиться с удаленным хостом. Тем путем Ваше приложение только зависло бы в течение X секунд, прежде чем оно сдастся.

Некоторые другие вещи отметить:

  • Определенный вызов к SCNetworkReachabilityGetFlags (), что Вы спрашиваете о (т.е. строка ~399 в Reachability.m) пытается видеть, "достижим" ли www.apple.com, чтобы вывести, если "внешний Интернет" "достижим" в целом.
  • В Системной "достижимой" платформе Конфигурации Apple не мог бы означать то, что Вы думаете, что она делает. Согласно официальным документам, "достижимым", кажется, означает, что в теории Ваш компьютер мог соединиться с хостом X, если бы это хотело, но это, возможно, должно было бы на самом деле установить соединение сначала (например, набрать модем сначала). Другими словами, SCNetworkReachabilityGetFlags () на самом деле не устанавливает соединение.
6
ответ дан 14 December 2019 в 13:47
поделиться