【发布时间】:2020-06-02 09:38:50
【问题描述】:
目标
我有一个 monorepo 设置,其中包含越来越多的服务 services。当我部署应用程序时,我运行一个命令,每个 服务都将被重建,最终的 Docker 镜像将被发布。 但是随着服务数量的增加,重建所有服务所需的时间变得越来越长,尽管只对其中少数服务进行了更改。
为什么我的设置重建了所有的 Docker 镜像,尽管只有少数发生了变化?我的目标是仅重建和发布实际更改的图像。
详情
我正在使用 Bazel 构建我的 Docker 映像,因此在我的项目的根目录中有一个 BUILD 文件,其中包含我要部署时运行的目标。它只是k8s_objects 的集合,其中包含所有服务:
load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")
k8s_objects(
name = "kubernetes_deployment",
objects = [
"//services/service1",
"//services/service2",
"//services/service3",
"//services/service4",
# ...
]
)
同样,每个服务都有一个 BUILD 文件,它首先从所有源文件创建一个 Typescript 库,然后创建 Node.Js 图像,最后将图像传递给 Kubernetes 对象:
load("@npm_bazel_typescript//:index.bzl", "ts_library")
ts_library(
name = "lib",
srcs = glob(
include = ["**/*.ts"],
exclude = ["**/*.spec.ts"]
),
deps = [
"//packages/package1",
"//packages/package2",
"//packages/package3",
],
)
load("@io_bazel_rules_docker//nodejs:image.bzl", "nodejs_image")
nodejs_image(
name = "image",
data = [":lib", "//:package.json"],
entry_point = ":index.ts",
)
load("@k8s_deploy//:defaults.bzl", "k8s_deploy")
k8s_object(
name = "service",
template = ":service.yaml",
kind = "deployment",
cluster = "my-cluster"
images = {
"gcr.io/project/service:latest": ":image"
},
)
注意,Typescript lib 还依赖于一些包,重新部署时也应该考虑到这些包!
要部署,我运行 bazel run :kubernetes_deployment.apply
最初我决定选择 Bazel 的一个原因是因为我认为它可以自己处理构建仅更改的服务。但显然情况并非如此,或者我的设置在某些方面有问题。
如果您需要更详细地了解该项目,可以在这里查看:https://github.com/flolude/cents-ideas
【问题讨论】:
-
感谢您说出您的目标,但我真的不明白您的问题或问题是什么。您能否澄清一下,以便我们无需深入研究项目即可提供帮助?
-
你是对的,我已经更新了问题
-
您是否为您的问题找到了解决方案或重大改进?
-
我不确定我当时做错了什么。但是 Bazel 通常会缓存图像,并且仅在依赖项发生更改时才重新构建。如果你需要帮助可以看看这个项目:github.com/drakery3d/fullbazel
标签: docker kubernetes google-kubernetes-engine bazel monorepo