【问题标题】:Docker buildx - Select specific nodes for build monorepo supportDocker buildx - 选择特定节点来构建 monorepo 支持
【发布时间】:2021-06-26 23:30:20
【问题描述】:
我们正在使用一个名为 Tilt 的 K8s 开发工具(https://tilt.dev/),它使用大量微服务构建堆栈的开发映像并允许实时重新加载等。
我已经使用 buildx create 将远程构建器 pod 部署到 AWS K8s 集群,并具有 10 个副本。但是,分离构建似乎只使用其中两个 pod 进行实际构建(基于我在集群中看到的 CPU 和内存指标),另外 8 个处于空闲状态。运行向上倾斜会启动所有微服务的并发映像构建,因此将构建步骤分散到所有 10 个正在运行的构建器 pod 中是理想的。
我怀疑这是因为我们的项目当前存在于 monorepo 中,并且在项目的根级别使用相同的 Dockerfile.dev 来构建所有图像 (在构建时使用 --build-arg 传递的次要配置)
-
我的怀疑正确吗?很难说,但似乎 buildx 负载平衡基于 Dockerfile 上下文。如果是这样,是否可以覆盖此行为?
-
或者,有没有办法手动选择 buildx 节点?编写一个循环遍历现有远程节点以分散构建负载的选择器很容易
【问题讨论】:
标签:
docker
kubernetes
monorepo
docker-buildkit
buildx
【解决方案1】:
FWIW -我通过执行以下操作找到了可行的解决方法:
#!/usr/bin/env bash
for dir in myMonorepoServices/*; do
# get the name of the service folder
SERVICE=$(echo $dir | cut -d'/' -f 2)
echo "? ? ? Creating a remote builder for $SERVICE... ? ? ?"
$(docker buildx create --name $SERVICE-docker-builder --driver kubernetes --driver-opt replicas=1,namespace=docker-builder --use)
docker buildx inspect --bootstrap
done
这会在远程集群上创建一个单独的“命名”构建器 pod,我可以使用 --builder 标志直接定位它,如下所示:
docker buildx build --builder=myServiceName-docker-builder
并不是真正意义上的“负载平衡”,但这确实可以确保每个服务都构建在自己的专用 pod 上。