2016-07-28 20 views
6

Tôi đang cố gắng lấy hai thùng chứa đang chạy một dịch vụ golang khác nhau. Cả hai dịch vụ đều được xây dựng với gói net/http. Tôi có một giao diện API làm giao diện người dùng và dịch vụ xác thực.Golang Microservices không thể liên lạc bằng Docker for Mac

Đây là tập tin soạn của tôi:

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 

Tôi biết các liên kết đang làm việc vì từ container api tôi có thể ping authcurl -X Post http://auth:8080/validate nhưng trong golang tôi nhận được một dial address tcp i/o timeout. Đây là mã 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 
} 

client.Do(request) là điều đang ném lỗi Quay số. Bây giờ dịch vụ auth của tôi là thậm chí không được chạm vào bởi vì tôi có một logger mà in để sàng lọc tất cả các yêu cầu đó là đến ở.

  • env.AuthHost được ánh xạ tới các biến AUTH_HOST môi trường.
  • env.AuthPort được ánh xạ tới biến môi trường Auth_PORT.

Trợ giúp được đánh giá cao.

Nếu nó giúp tôi chạy 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 

Cả golangs Dockerfile trông như thế này:

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:

Vì vậy, tôi chạy net.LookupHost(env.AuthHost) trong golang và nó đang trở lại một địa chỉ IP khác nhau sau đó ping, curl, và thậm chí docker inspect. Đây có phải là một điều golang không?

EDIT:

Xin lỗi vì tất cả các chỉnh sửa loại cố gắng để gỡ lỗi là ngày đi.

Nếu tôi xóa phần cổng của số authString, yêu cầu sẽ được thông qua nhưng gặp lỗi khi phân tích phản hồi. Câu trả lời là chuyển hướng 301 bởi NGINX mà tôi nghĩ là lạ bởi vì đó không phải là ngay cả trong ngăn xếp của tôi. Tiêu đề vị trí cho chuyển hướng là localhost, điều tôi cho là lạ.

Tôi đã thử hiển thị cổng trên máy chủ và truy cập cổng đó bằng cổng đó mà không may mắn hơn (cùng tên máy chủ).

EDIT:

Vì vậy, nó là một chỉ Mac điều tôi giả định. Tôi nhân bản các repo và chạy trên Windows 10 và tôi đã có thể kết nối với dịch vụ auth của tôi. Đây có phải là lỗi Docker for Mac không? Tôi có thể sẽ báo cáo cho họ, nhưng tôi sẽ không xem xét việc này vì nó vẫn là một vấn đề cho người dùng Mac.

+0

tôi không nghĩ rằng khách hàng. Làm lại, bạn có thể thử thêm 'time.Sleep (10 * time.Second)' trước khi bạn quay số để có cơ hội tốt hơn của máy chủ grpc đang trực tuyến. bạn cũng có thể thử thay thế 'liên kết: -db' bằng' depends_on: -db' – Plato

+0

Tôi không thấy cách thêm 10 giây trước khi cuộc gọi sẽ trợ giúp? Đó là lỗi không đổi. Mỗi lần tôi thử và nhấn phương pháp này cùng một lỗi, mọi lúc, không khởi động lại vùng chứa. và tôi có cần liên kết để tôi có thể giữ địa chỉ ip không? – Clemsonopoly94

Trả lời

1

Vì vậy, Docker for Mac vừa ra mắt với phiên bản beta mới ngay hôm nay. Điều này dường như đã khắc phục được sự cố của tôi khi kết nối.Bây giờ tôi đã thực hiện thay đổi mã nguồn khi tôi phát hiện ra nó hoạt động trên máy tính Windows của tôi.

Dưới đây là phiên bản của Docker cho sửa chữa:

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 

Và đây là tập tin soạn:

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 

tôi đã di chuyển các dịch vụ xung quanh nhưng tôi không thấy bất cứ điều gì khác nhau mà sẽ thay đổi giao tiếp giữa các container. Đây chỉ là ở đây trong trường hợp những người khác có cùng một vấn đề.

Các vấn đề liên quan