2016-07-28 22 views
6

Próbuję uzyskać dwa kontenery, z których każdy ma inną usługę golang. Obie usługi zostały zbudowane za pomocą pakietu net/http. Mam frontend API jako jeden i serwer zaplecza uwierzytelniania.Golang Microservices nie może komunikować się za pomocą Docker na Maca

Oto moja komponować pliku:

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 

wiem linki działają, ponieważ z pojemnika api mogę ping auth i curl -X Post http://auth:8080/validate ale w golang mogę dostać dial address tcp i/o timeout. Oto kod golang.

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 
} 

To, co rzuca błąd Dial. Teraz mój serwis auth nie jest nawet dotknięciu bo mam rejestrator, który drukuje na ekran każdy wniosek, który przychodzi w.

  • env.AuthHost jest odwzorowana na zmiennej AUTH_HOST środowiska.
  • env.AuthPort jest zmapowany do zmiennej środowiskowej Auth_PORT.

Znaczna pomoc jest doceniana.

Jeśli to pomaga, uruchamiam system 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 

Oba golangs Dockerfile wygląda następująco:

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:

Więc wpadłem net.LookupHost(env.AuthHost) ciągu golang i wraca inny adres IP, a następnie ping, curl, a nawet docker inspect. Czy to jest golang?

EDIT:

Niestety dla wszystkich edycji rodzaj próbujących debugowania jak dzień przechodzi.

Po usunięciu części portu authString, żądanie przechodzi, ale pojawia się błąd podczas analizowania odpowiedzi. Odpowiedzią jest przekierowanie 301 wykonane przez NGINX, co moim zdaniem jest dziwne, ponieważ nie jest to nawet w moim stosie. Nagłówek lokalizacji przekierowania to localhost, co również uważam za dziwne.

Próbowałem eksponować port na hoście i uzyskując do niego dostęp za pomocą tego portu bez większych problemów (ta sama nazwa hosta).

EDIT:

Więc jest to tylko sprawa Mac zakładam. Sklonowałem repozytorium i uruchomiłem Windows 10 i mogłem połączyć się z moją autoryzowaną usługą. Czy to był błąd Docker na Maca? Prawdopodobnie zgłoszę je do nich, ale nie uważam tego za zamknięty, ponieważ nadal jest to problem dla użytkowników komputerów Mac.

+0

Nie sądzę, aby klient próbował ponownie, możesz spróbować dodać 'time.Sleep (10 * time.Second)' przed wybraniem numeru, aby zwiększyć szanse na to, że serwer Grpc będzie online. możesz także spróbować zastąpić 'links: -db' z' depend_on: -db' – Plato

+0

Nie widzę, jak pomocne może być dodanie 10 sekund przed wywołaniem? Jest to stały błąd. Za każdym razem, gdy próbuję trafić tę samą metodę za każdym razem, żaden kontener się nie restartuje. i czy nie potrzebowałbym linków, aby uzyskać adres IP? – Clemsonopoly94

Odpowiedz

1

Tak więc Docker dla Maca właśnie pojawił się z nową wersją beta dzisiaj. To chyba naprawiło mój problem z łączeniem.Teraz wprowadziłem zmiany w kodzie źródłowym, gdy dowiedziałem się, że działa na moim komputerze z systemem Windows.

Oto wersja Döcker do poprawki:

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 

A oto plik komponować:

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 

zrobiłem przenieść usługi wokół, ale nie widzę nic innego, co byłoby zmienić komunikacja między kontenerami. To jest właśnie tutaj, gdy inni mają ten sam problem.