使用golang开发grpc的应用时,需要安装grpc包。grpc包有将近200M,由于国内墙的原因,使用go get命令基本都是拉取失败。就算用vpn翻墙拉取也很慢。这里把构件docke镜像时需要的grpc依赖文件打包,方便以后使用。
正常构建的dockerfile如下
FROM golang:alpine AS builder
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
使用打包文件的方法如下
- 通过网盘获取我打包好的文件(文件的获取方法可以参考下面的“获取镜像中文件的方法”)放到dockerfile同目录。链接:https://pan.baidu.com/s/1elNtsQWRsAVJ3OqDkk4x3Q 提取码:1tyo
- 修改dockefile文件,将压缩文件解压到/go/src目录下。
FROM golang:alpine AS builder
ADD grpc.tar.gz /go/src
golang的grpc编译环境大功告成,接下来就执行正常的构建命令就好了。
扩展知识:获取镜像中文件的方法
使用该方法大家可以根据自己的需要定制打包的内容灵活使用。
以下方法基于docker-desktop 2.2.0.3(42716)环境。
有如下dockerfile
FROM golang:alpine AS builder
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
WORKDIR /uuid_service
COPY . .
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成功后,获取镜像里所有下载的依赖包有两种方法。
- 观察docker build 的日志输出,
Sending build context to Docker daemon 117.2MB
Step 1/13 : FROM golang:alpine AS builder
---> e1fd9820be16
Step 2/13 : RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
---> Using cache
---> 96f6c9af81cc
Step 3/13 : RUN apk add git
---> Using cache
---> ecb5b4b3c5dc
Step 4/13 : RUN go get -u github.com/gorilla/mux
---> Using cache
---> 4a90ac5181c9
Step 5/13 : RUN go get -u google.golang.org/grpc
---> Using cache
---> 27fe0d1ee559
Step 6/13 : WORKDIR /uuid_service
---> Using cache
---> c912b28f2ccc
Step 7/13 : COPY . .
---> c8d17282eea5
Step 8/13 : RUN go build rpc_server.go
---> Running in 697503c40565
Removing intermediate container 697503c40565
---> b1cd55c7d153
Step 9/13 : FROM alpine:latest AS production
---> e7d92cdc71fe
Step 10/13 : WORKDIR /uuid_service
---> Using cache
---> 998150fa0c67
Step 11/13 : COPY --from=builder /uuid_service/rpc_server .
---> Using cache
---> 1ebcc0aba1e9
Step 12/13 : EXPOSE 13000
---> Using cache
---> b5b870eaa1a7
Step 13/13 : ENTRYPOINT ["./rpc_server"]
---> Using cache
---> db5647ad1232
Successfully built db5647ad1232
Successfully tagged t:v1
docker build每执行一步都会生成一个镜像,找到需要的镜像id就可以了。这个输出的例子里面,我们需要的镜像是 27fe0d1ee559 。
- 使用docker images命令查看
d:\> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
uuid v1 db5647ad1232 39 hours ago 18.4MB
<none> <none> 360467d39956 39 hours ago 610MB
名字为<none>的镜像,就是dockfile使用多段构建时出现的中间产物,这个镜像就是dockerfile中builder阶段的的镜像。
接下来运行找到的镜像,把文件复制出来。
注意:下面的命令会将windows系统中的d:\files目录映射到容器中的/go/src目录,需要打开docker-desktop/settings/resources/file sharing设置,将需要映射的盘符勾选并确定。否则话会出现“Unhandled exception: Drive has not been shared”错误提示。
d:\> docker run -it -v d:\files:/files 360467d39956 /bin/sh
cd /go/src
tar czf grpc.tar.gz *
cp grpc.tar.gz /files
exit
这样就将容器中的文件打包放到d:\files目录下面了。