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 dieAUTH_HOST
Umgebungsvariable.env.AuthPort
ist der UmgebungsvariablenAuth_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.
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
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