问题描述

写了个grpc服务并编译成docker,在docker中执行go build的时候出现了以下错误

unexpected directory layout:
        import path: _/go/src/uuid
        root: /go/src
        dir: /go/src/uuid
        expand root: /go
        expand dir: /go/src/uuid
        separator: /

错误提示的意思是:意外的目录布局。
查看容器中目录结构

├── api
├── github.com
├── go
├── golang.org
├── google.golang.org
├── rpc_server.go
└── uuid

dockerfile文件内容

FROM golang:alpine AS builder
WORKDIR $GOPATH/src
# RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# RUN apk add git
# RUN go get -u github.com/gorilla/mux
# RUN go get -u google.golang.org/grpc
COPY . .
RUN go build rpc_server.go

这里直接用注释掉的go get命令安装依赖包是不会出现这个问题的。但是因为墙的原因mux,grpc的拉取非常慢,这里把拉取好的文件直接复制进去。可能build系统认为依赖库和项目代码放在同一层目录不合理,其实这里只要把依赖和项目代码分成不同目录就可以解决了。

解决方法

将依赖项目放在$GOPATH/src下,自己的项目代码创建一个新目录存放,dockerfile文件改成如下内容

FROM golang:alpine AS builder
WORKDIR $GOPATH/src
COPY  github.com github.com
COPY golang.org golang.org
COPY google.golang.org google.golang.org
WORKDIR uuid_service
COPY api api
COPY go go
COPY uuid uuid
COPY rpc_server.go
RUN go build rpc_server.go

FROM alpine:latest AS production
WORKDIR /uuid_service
COPY --from=builder /uuid_service/rpc_server .
EXPOSE 13000
ENTRYPOINT ["./rpc_server"]

重新执行docker build命令通过。

文章来源于互联网,如有雷同请联系站长删除:go build 报错 unexpected directory layout 的解决

发表评论