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.
İ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
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