2016-07-28 41 views
6

Her biri farklı bir golang hizmeti çalıştıran iki kap almaya çalışıyorum. Her iki hizmet de net/http paketi ile oluşturulmuştur. Bir API öneki ve Kimlik Doğrulama hizmeti arka ucum var. Ben bağlantılar ben ping auth ve curl -X Post http://auth:8080/validate ama golang içinde bir dial address tcp i/o timeout alabilirim API kabından çünkü çalıştığını biliyorGolang Microservices, Mac için Docker kullanarak iletişim kuramıyor

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 

:

İşte benim oluştur dosyasıdır. İşte golang kodu.

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 
} 

client.Do(request), Çevirme hatasını atar. Ben geliyor her talebi ekrana yazdıran bir logger var çünkü Şimdi benim yetkilendirme servisi bile dokundu varlık değildir.

  • env.AuthHost

    AUTH_HOST ortam değişkeni eşleştirilir.
  • env.AuthPort, Auth_PORT ortam değişkeniyle eşlenmiştir.

Çok yardımı minnettarız.

MacOSX çalıştırmama yardımcı olur.

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 

Hem golangs Dockerfile şuna benzer:

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"] 

DÜZENLEME:

Yani golang içinde net.LookupHost(env.AuthHost) koştu ve daha sonra ping farklı bir IP adresi dönüyor, curl ve hatta docker inspect. O zaman bu bir şey mi?

DÜZENLEME: tür gün geçtikçe tamir etmeye çalışan tüm düzenlemeleri için

üzgünüm.

authString'un bağlantı noktası bölümünü kaldırırsam, istek yanıtlanır ancak yanıt ayrıştırılırken hatayla karşılaşılır. Yanıt, garip olduğunu düşündüğüm NGINX tarafından 301 yönlendirmesidir, çünkü bu benim yığınımda bile değil. Yönlendirme için konum başlığı localhost, ki bu da garip.

Ana makinede bir bağlantı noktası açığa çıkarmayı ve daha iyi bir şansla (aynı ana makine adı) bu bağlantı noktasına erişmeyi denedim.

DÜZENLEME:

Demek ki ben varsayalım Mac tek şeydir. Repo'yu klonladım ve Windows 10'da koştum ve servisime bağlanabildim. Bu Mac için Docker hatası mı? Muhtemelen onlara rapor edeceğim, ancak yine de Mac kullanıcıları için bir sorun olduğu için bunu düşünmüyorum.

+0

İstemciyi düşünmüyorum. Tekrar denemek için grpc sunucusunun daha iyi bir şansını çevirmeden önce 'time.Sleep (10 * time.Second)' ifadesini eklemeyi deneyebilirsiniz. Ayrıca 'linkler: -db' değiştirmeyi de deneyebilirsiniz: • variable_on: -db' – Plato

+0

Aramadan önce 10 saniye daha eklemenin nasıl olacağını göremiyorum? Bu sabit bir hatadır. Her seferinde aynı yöntemi denedim ve aynı hatayı, her seferinde konteynır yeniden başlatır. ve ip adresine ihtiyacım olan bağlantılara ihtiyacım olmaz mı? – Clemsonopoly94

cevap

1

Do Docker for Mac, bugün yeni bir beta sürümü ile çıktı. Bu benim sorunumu bağlantıyla düzeltti.Şimdi Windows bilgisayarımda çalıştığını öğrendiğimde kaynak kodda değişiklik yaptım. İşte

düzeltme için Docker sürümüdür:

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 

Ve burada oluşturma dosyasıdır:

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 

Etrafa hizmetlerini hareket ama ben değiştireceğini şey farklı görmüyorum konteynerler arasındaki iletişim. Bu, başkalarının da aynı problemleri olduğu için burada.