问题描述
写了个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命令通过。
网友评论