我正在尝试将我的 golang grpc 应用程序转换为 docker 容器,但是在尝试构建时我总是遇到错误。
错误是
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 容器的代码
docker build -t alhennessey92/mygoapptest .
我使用的go代码来自google cloud grpc demo stickynote - https://cloud.google.com/solutions/mobile/mobile-compute-engine-grpc
我认为错误与使用命令 go get
有关,但我不确定
谢谢你的帮助
最佳答案
您需要将 go get
添加到您的 docker 文件中,或者您需要 vendor使用类似 dep 的工具的第三方库.
vendoring 更好,但如果你只想在 docker 容器中下载文件,请执行以下操作:
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"]
关于docker - 使用 gRPC Docker 容器构建 Go 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46412256/