2017-07-04 2 views
0

nehme ich auf einer Host-Maschine bin mit Docker-compose läuft 2 Container/Dienstleistungen:Connect Docker-Container: Frontend zu GraphQL Backend über Docker Compose auf demselben Host

  • Backend graphql (Ports: 8000: 8000)
  • Frontend reagieren (Ports: 8081: 8081)

im Frontend Container, wo mein reagieren + apollo Code lebt, ich diese const setzen müssen:

// frontend container code 
export const APOLLO = { 
    uri: 'http://0.0.0.0:8000/graphql' // << not working, what to use here? 
}; 

Der URI-Wert ist jedoch nicht in der Lage, eine erfolgreiche Verbindung zum Backend-Endpunkt von graphql herzustellen. Ich erhalte Fehler wie Error Network error: request to http://0.0.0.0:8000/graphql failed, reason: connect ECONNREFUSED 0.0.0.0:8000

Die Container funktionieren gut auf eigene Faust. Ich bin in der Lage, zu http://0.0.0.0:8000, http://0.0.0.0:8000/graphql, http://0.0.0.0:8081 zu navigieren, um mit ihnen einzeln zu interagieren. Ich bin auch in der Lage, jeden Container zu betreten und den anderen über ihre Service-Namensräume mit ping backend oder ping frontend zu erreichen.

Wenn ich jedoch uri: 'http://backend:8000/graphql' oder uri: 'http://backend/graphql' in meinem Code, bekomme ich den Fehler Error Network error: only absolute urls are supported.

Unter docker inspect backend erhalte ich die IP-Adresse des Back-End-Containers wie folgt: '172.18.0.5'. Was ich versuchte, in die URI als uri: 'http://172.18.0.5/graphql' zu stecken, aber ich bekomme Error Network error: Network request failed with status 403 - "Forbidden"

Wie sollte ich Backend Docker Container an das Frontend innerhalb des Codes in diesen Szenarien verbunden?

Danke!

+1

Fügen Sie die 'docker-compose.yml', die Docker-Version, das Host-Betriebssystem und alle unterstützenden externen Dateien hinzu, damit wir sie reproduzieren können. –

Antwort

1

Dies wurde behoben, indem die Server lokal anstelle von Docker ausgeführt wurden und festgestellt wurde, dass das Back-End den Front-End-Eintrag aufgrund nicht gesetzter CORS-Header ablehnte. Whitelisted IP der Frontends und es hat funktioniert. Getestet wieder in Docker-Containern mit dem Back-End-ip http://172.18.0.5/graphql und Verbindung war perfekt.

Hoffe, das hilft!

Bearbeiten: Bezug auf den Container-Namen in der URL Host-Namen, d. H. http://backend/graphql funktioniert auch dank der Docker-Netzwerk-Brücke Setup von Docker komponieren. Dies ist eine bessere Lösung als das oben beschriebene Andocken des Docker-Containers.

0

Dies ist ein Problem, das auftritt, wenn die Knoten-Fetch keinen Zugriff auf ein Protokoll oder einen Hostnamen

https://github.com/bitinn/node-fetch/blob/e2603d31c767cd5111df2ff6e2977577840656a4/src/request.js#L125

if (!parsedURL.protocol || !parsedURL.hostname) { 
    throw new TypeError('Only absolute URLs are supported'); 
} 

auf hat Je nachdem, wie Ihre graphql Backend-Anfragen verarbeitet, könnte es eine gute Idee sein, Abmelden der URLs für jeden Dienstendpunkt und Sicherstellen, dass die URL ein AND-Hostprotokoll enthält oder der Abruf fehlschlägt.

Für mich selbst trat der Fehler für mich auf, als meine Host-Variable von der ENV für meine Service-Endpunkte wie undefined zurückkam.

Verwandte Themen