2016-07-28 12 views
6

Ich versuche, zwei Container zu erhalten, die jeweils einen anderen Golang-Dienst ausführen. Beide Dienste wurden mit dem Paket net/http erstellt. Ich habe ein API-Frontend als ein und ein Authentifizierungsservice-Backend.Golang Microservices kann nicht mit Docker für Mac kommunizieren

Hier ist meine compose Datei:

version: "2" 
services: 
    staticfiles: 
    build: ./files 
    volumes: 
     - /public 
     - /views 
    api: 
    build: ./api 
    environment: 
     - PORT=8080 
     - BASE_URL=https://example.org 
     - AUTH_HOST=auth 
     - AUTH_PORT=8080 
     - VIEW_DIR=/views 
     - PUBLIC_DIR=/public 
    ports: 
     - "80:8080" 
    volumes_from: 
     - staticfiles:ro 
    links: 
     - auth 
    depends_on: 
     - staticfiles 
    db: 
    build: ./postgres 
    environment: 
     - POSTGRES_USER=inheritor 
     - POSTGRES_DB=inheritor 
    auth: 
    build: ./auth 
    expose: 
     - "8080" 
    environment: 
     - PORT=8080 
     - DB_USER=inheritor 
     - DB_NAME=inheritor 
     - DB_HOST=db 
     - DB_Port=5432 
    links: 
     - db 

Ich weiß, dass die Verbindungen, weil aus dem api Behälter arbeiten kann ich ping auth und curl -X Post http://auth:8080/validate aber innerhalb golang ich ein dial address tcp i/o timeout bekommen. Hier ist der Golang-Code.

var (
    authString = "http://" + env.AuthHost + ":" + env.AuthPort 
) 

//ValidateToken validates a token using the session in DB 
func ValidateToken(req *model.ValidateRequest) (*model.JWTClaims, error) { 
    client := new(http.Client) 
    api := authString + "/validate" 
    cont, err := model.Jsonify(req) 
    if err != nil { 
     return nil, exception.NewInternalError("Could not turn the request into a json object.") 
    } 

    request, err := http.NewRequest("POST", api, bytes.NewBuffer(cont)) 
    if err != nil { 
     return nil, exception.NewInternalError("Could not create request: " + err.Error()) 
    } 
    request.Header.Set("Content-type", "application/json") 
    response, err := client.Do(request) 
    if err != nil { 
     return nil, exception.NewInternalError("Could not make the request: " + err.Error()) 
    } 
    defer response.Body.Close() 

    res := new(model.AuthResponse) 
    res.Claims = new(model.JWTClaims) 
    decoder := json.NewDecoder(response.Body) 
    err = decoder.Decode(&res) 
    spew.Dump(response.Body) 
    if err != nil { 
     return nil, exception.NewInternalError("Could not parse response back from auth service. " + err.Error()) 
    } 

    if response.StatusCode != http.StatusOK { 
     return nil, exception.NewInvalidJWTError(res.Error) 
    } 

    return res.Claims, nil 
} 

Die client.Do(request) ist, was den Wählfehler wirft. Jetzt ist mein Auth Dienst nicht einmal berührt zu werden, weil ich einen Logger, die jeden Wunsch Siebdrucke, die in kommt.

  • env.AuthHost abgebildet wird auf die AUTH_HOST Umgebungsvariable.
  • env.AuthPort ist der Umgebungsvariablen Auth_PORT zugeordnet.

Viel Hilfe wird geschätzt.

Wenn es hilft, ich benutze MacOSX.

Client: 
Version:  1.12.0-rc4 
API version: 1.24 
Go version: go1.6.2 
Git commit: e4a0dbc 
Built:  Wed Jul 13 03:28:51 2016 
OS/Arch:  darwin/amd64 
Experimental: true 

Server: 
Version:  1.12.0-rc4 
API version: 1.24 
Go version: go1.6.2 
Git commit: e4a0dbc 
Built:  Wed Jul 13 03:28:51 2016 
OS/Arch:  linux/amd64 
Experimental: true 

Beide golangs sieht Dockerfile wie folgt aus:

FROM golang:1.6 
RUN mkdir -p /go/src/github.com/dixonwille/Inheritor/api 
WORKDIR /go/src/github.com/dixonwille/Inheritor/api 

COPY . /go/src/github.com/dixonwille/Inheritor/api 

RUN go build -v -o Inheritor cmd/Inheritor/main.go 

USER nobody 
ENTRYPOINT ["./Inheritor"] 

EDIT:

So lief ich net.LookupHost(env.AuthHost) innerhalb golang und es wird eine andere IP-Adresse zurückkehr dann ping, curl und sogar docker inspect. Ist das eine Golang-Sache?

EDIT:

Sorry für alle Bearbeitungen Art zu debuggen versuchen, wie der Tag geht.

Wenn ich den Port-Teil der authString entfernen, durchläuft die Anfrage aber eine Fehlermeldung beim Parsen der Antwort. Die Antwort ist eine 301-Weiterleitung von NGINX, die ich für merkwürdig halte, weil das nicht einmal in meinem Stack ist. Der Standort-Header für die Weiterleitung ist localhost, was ich auch seltsam finde.

Ich habe versucht, einen Port auf dem Host-Computer offen zu legen und mit diesem Port ohne Glück (gleicher Hostname) darauf zuzugreifen.

EDIT:

So ist es eine nur Mac Sache, die ich übernehmen. Ich klonte das Repo und lief auf Windows 10 und konnte mich mit meinem Auth-Dienst verbinden. Wäre das Docker für Mac Fehler? Ich werde es ihnen wahrscheinlich melden, aber ich würde das nicht für abgeschlossen halten, da es immer noch ein Problem für Mac-Benutzer ist.

+0

ich glaube nicht, client.To Versuche, können Sie versuchen, hinzufügen 'time.Sleep (10 * time.Second)', bevor Sie für eine bessere Chance der Grpc-Server ist online. Sie können auch versuchen, 'links: -db' durch' depends_on: -db' zu ersetzen. – Plato

+0

Ich sehe nicht, wie das Hinzufügen von 10 Sekunden vor dem Anruf hilft? Es ist ein konstanter Fehler. Jedes Mal, wenn ich versuche, diese Methode auf den gleichen Fehler zu setzen, wird kein Container neu gestartet. und brauche ich keine Links, damit ich die IP-Adresse bekommen kann? – Clemsonopoly94

Antwort

1

So Docker für Mac kam gerade mit einer neuen Beta-Version heute. Dies schien mein Problem mit der Verbindung gelöst zu haben.Jetzt habe ich Änderungen am Quellcode vorgenommen, als ich herausfand, dass es auf meinem Windows-PC funktionierte. Hier

ist die Version von Docker für fix:

Client: 
Version:  1.12.0 
API version: 1.24 
Go version: go1.6.3 
Git commit: 8eab29e 
Built:  Thu Jul 28 21:04:48 2016 
OS/Arch:  darwin/amd64 
Experimental: true 

Server: 
Version:  1.12.0 
API version: 1.24 
Go version: go1.6.3 
Git commit: 8eab29e 
Built:  Thu Jul 28 21:04:48 2016 
OS/Arch:  linux/amd64 
Experimental: true 

Und hier ist die Compose-Datei:

version: "2" 
services: 
    staticfiles: 
    build: ./files 
    volumes: 
     - /public 
     - /views 
     - /migrations 
    databasefiles: 
    build: ./databasefiles 
    volumes: 
     - /var/lib/postgresql/data 
    db: 
    build: ./postgres 
    depends_on: 
     - databasefiles 
    volumes_from: 
     - databasefiles 
    environment: 
     - POSTGRES_USER=inheritor 
     - POSTGRES_DB=inheritor 
    auth: 
    build: ./auth 
    expose: 
     - "8080" 
    depends_on: 
     - staticfiles 
    volumes_from: 
     - staticfiles:ro 
    environment: 
     - PORT=8080 
     - DB_USER=inheritor 
     - DB_NAME=inheritor 
     - DB_HOST=db 
     - DB_PORT=5432 
     - MIGRATION_DIR=/migrations 
    links: 
     - db 
    api: 
    build: ./api 
    environment: 
     - PORT=8080 
     - BASE_URL=https://example.org 
     - AUTH_HOST=auth 
     - AUTH_PORT=8080 
     - VIEW_DIR=/views 
     - PUBLIC_DIR=/public 
    ports: 
     - "80:8080" 
    volumes_from: 
     - staticfiles:ro 
    links: 
     - auth 
    depends_on: 
     - staticfiles 

I Dienste bewegen hat, aber ich sehe nicht, etwas anderes, dass die Änderung würde Kommunikation zwischen Containern. Dies ist nur hier, wenn andere dasselbe Problem haben.

Verwandte Themen