用go + bazel + grpc + docker进行确定性的构建

454 阅读2分钟

gRPC+golangbazel的决定性容器镜像。

下面的例子将建立一个golang gRPC客户端/服务器,然后将二进制文件嵌入到容器镜像中。

这些镜像无论在哪里构建,都会有一个一致的镜像哈希。

如需参考,请参见。

要运行这个样本,你需要安装bazel

salrashid123/go-grpc-bazel-docker

建立图像

medium.com/media/c23fc…

注意,bazel的基本图像指定了图像+哈希值,所以你将从一个已知的状态开始。

  • 工作空间

medium.com/media/674c7…

检查图像

medium.com/media/88d11…

检查生成的图像...无论你在哪里生成图像,这些都是一样的

medium.com/media/93e89…

(可选)gRPC客户端/服务器

(为什么不呢......你已经建立了它,给它一个机会。)

docker run -p 50051:50051 bazel/greeter_server:greeter_server_image

指定docker镜像

你可以通过在这里设置repository命令来指定repo前缀。在下面的例子中,它在dockerhub上,作为handle salrashid123

container_image(

在推送到dockerhub上

  • 客户端
$ docker push salrashid123/greeter_server:greeter_server_image

在任何其他机器上拉出镜像并检查

$ docker inspect salrashid123/greeter_server@sha256:e3e95e8f07b552ee2f60aaf6308b75ee660e24ff58d3a2b25be26f53476cde87

云构建

你可以使用Cloud Build来创建镜像,方法是使用bazel builder并指定要导出的存储库路径。在下面的例子中,存储库被设置为谷歌容器注册处。

container_image(

medium.com/media/0366d…

然后在构建和推送的同一系统上。

medium.com/media/754c8…

就这样......你现在已经有了确定的构建......现在好了......是时候学习 bazel 了!

TODO:

  • 使用 gazelle 来处理依赖关系 bazel run //:gazelle -- upd-repos -from_file=examples/greeter_server/go.mod


使用go + bazel + grpc + docker的确定性构建最初发表于Google Cloud - Communityon Medium,在那里人们通过强调和回应这个故事继续对话。