docker - 使用 gRPC Docker 容器构建 Go 时出错

标签 docker go containers grpc

我正在尝试将我的 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/

相关文章:

docker - 如何在适用于 Linux 的 Windows 子系统上的 docker 中使用 -v 卷参数

docker - 如何列出停止的 Docker 容器中的文件

string - 在 Golang 中最后一次出现模式后解析提取 header 的 HTML 模板

c++ - 有什么方法可以解决模板类中的前向声明?

powershell - 通过 Docker API 在运行的容器中执行 powershell 命令

unit-testing - 去单元测试无法加载文件

postgresql - pq : sorry, 已经有太多客户端

C++ 关联容器 - 为什么标准没有定义交换和替换键的方法?

docker - 为什么要求在 Kubernetes PodSecurityPolicy 冗余中删除所有功能并具有非 root + 禁止权限提升?

docker - Centos 服务已启动但仍处于禁用状态