2017-09-25 37 views
-4

我想把我的golang grpc應用程序變成一個碼頭容器,但是我試圖建立時不斷收到錯誤。錯誤建設去與gRPC碼頭容器

該錯誤是

messagepb/stickynote.pb.go:16:8: cannot find package "github.com/golang/protobuf/proto" in any of: 
     /usr/local/go/src/github.com/golang/protobuf/proto (from $GOROOT) 
     /go/src/github.com/golang/protobuf/proto (from $GOPATH) 
sticky.go:6:2: cannot find package "github.com/llgcode/draw2d" in any of: 
     /usr/local/go/src/github.com/llgcode/draw2d (from $GOROOT) 
     /go/src/github.com/llgcode/draw2d (from $GOPATH) 
sticky.go:7:2: cannot find package "github.com/llgcode/draw2d/draw2dimg" in any of: 
     /usr/local/go/src/github.com/llgcode/draw2d/draw2dimg (from $GOROOT) 
     /go/src/github.com/llgcode/draw2d/draw2dimg (from $GOPATH) 
messagepb/stickynote.pb.go:21:2: cannot find package "golang.org/x/net/context" in any of: 
     /usr/local/go/src/golang.org/x/net/context (from $GOROOT) 
     /go/src/golang.org/x/net/context (from $GOPATH) 
messagepb/stickynote.pb.go:22:2: cannot find package "google.golang.org/grpc" in any of: 
     /usr/local/go/src/google.golang.org/grpc (from $GOROOT) 
     /go/src/google.golang.org/grpc (from $GOPATH) 
main.go:7:2: cannot find package "google.golang.org/grpc/credentials" in any of: 
     /usr/local/go/src/google.golang.org/grpc/credentials (from $GOROOT) 
     /go/src/google.golang.org/grpc/credentials (from $GOPATH) 

的Dockerfile是

FROM golang:latest 

RUN mkdir -p /go/src/github.com/alhennessey92/mygoapp 
ADD . /go/src/github.com/alhennessey92/mygoapp 

WORKDIR /go/src/github.com/alhennessey92/mygoapp 
EXPOSE 8080 

RUN go install github.com/alhennessey92/mygoapp 
ENTRYPOINT ["/go/bin/mygoapp"] 

文件結構是如下

go 
-- src 
---- github.com 
------ alhennessey92 
-------- mygoapp 
---------- Dockerfile 
---------- main.go 
---------- sticky.go 
---------- messagepb 
------------ stickynote.pb.go 
------------ stickynote.proto 

這是main.go代碼

package main 

import (
    "io" 
    "net" 
    "log" 
    "google.golang.org/grpc/credentials" 
    "golang.org/x/net/context" 
    pb "github.com/alhennessey92/mygoapp/messagepb" 
    "google.golang.org/grpc" 
) 


const (
    useSSL = false 
) 

type StickyNoteServer struct{} 

var stickyNoteServer StickyNoteServer 



func (s *StickyNoteServer) Get(ctx context.Context, r *pb.StickyNoteRequest) (*pb.StickyNoteResponse, error) { 
    var sticky Sticky 
    sticky.Message = r.Message 
    sticky.Centered = false 

    resp := &pb.StickyNoteResponse{} 
    stickyBytes, err := sticky.DrawPNG(512, 512) 
    resp.Image = *stickyBytes 

    return resp, err 
} 
func (s *StickyNoteServer) Update(stream pb.StickyNote_UpdateServer) error { 
    for { 
     in, err := stream.Recv() 
     if err == io.EOF { 
      return nil 
     } 
     if err != nil { 
      return err 
     } 

     var sticky Sticky 
     sticky.Message = in.Message 
     sticky.Centered = false 

     resp := &pb.StickyNoteResponse{} 
     stickyBytes, err := sticky.DrawPNG(512, 512) 
     resp.Image = *stickyBytes 

     if err := stream.Send(resp); err != nil { 
      return err 
     } 
    } 
    return nil 
} 

//[START main] 
func main() { 


    var err error 
    var lis net.Listener 
    var grpcServer *grpc.Server 
    if !useSSL { 
     lis, err = net.Listen("tcp", ":8080") 
     if err != nil { 
      log.Fatalf("failed to listen: %v", err) 
     } 
     grpcServer = grpc.NewServer() 
    } else { 
     certFile := "ssl.crt" 
     keyFile := "ssl.key" 
     creds, err := credentials.NewServerTLSFromFile(certFile, keyFile) 
     lis, err = net.Listen("tcp", ":443") 
     if err != nil { 
      log.Fatalf("failed to listen: %v", err) 
     } 
     grpcServer = grpc.NewServer(grpc.Creds(creds)) 
    } 
    pb.RegisterStickyNoteServer(grpcServer, &stickyNoteServer) 
    grpcServer.Serve(lis) 
} 

這是我在終端上運行的代碼來構建泊塢窗容器

docker build -t alhennessey92/mygoapptest . 

我使用的Go代碼是從谷歌雲GRPC演示stickynote - https://cloud.google.com/solutions/mobile/mobile-compute-engine-grpc

我認爲錯誤有是與使用命令go get,但我不知道

感謝您的幫助

+0

我認爲你需要在你的mkdir命令一個'-p'。 '運行mkdir -p/go/src/github.com/alhennessey92/mygoapp' – BMitch

+0

嗨,只是試過,但得到錯誤'無法加載軟件包:package /go/src/github.com/alhennessey92/mygoapp:import 「/go/src/github.com/alhennessey92/mygoapp」:無法導入絕對路徑「 –

+1

不同的錯誤,不同的問題。我認爲有人指出你的安裝線需要使用相對路徑:'RUN go install github.com/alhennessey92/mygoapp'。 – BMitch

回答

2

你要麼需要添加go get添加到您的碼頭文件,或者您需要使用dep工具vendor第三方庫。

vendoring比較好,但如果你想只下載搬運工容器文件,這樣做:

FROM golang:latest 

RUN mkdir -p /go/src/github.com/alhennessey92/mygoapp 
ADD . /go/src/github.com/alhennessey92/mygoapp 

WORKDIR /go/src/github.com/alhennessey92/mygoapp 
EXPOSE 8080 

RUN go get ./... 
RUN go install 
ENTRYPOINT ["/go/bin/mygoapp"]