Docker buildx - 为构建 monorepo 支持选择特定节点

问题描述

我们正在使用名为 Tilt (https://tilt.dev/) 的 K8s 开发工具,该工具使用大量微服务构建堆栈的开发映像,并允许实时重新加载等。

我已使用具有 10 个副本的 buildx create 将远程构建器 pod 部署到 AWS K8s 集群。然而,分拆构建似乎只使用其中两个 pod 进行实际构建(基于我在集群中看到的 cpu 和内存指标),另外 8 个处于空闲状态。向上运行会启动所有微服务的并发映像构建,因此最好将构建步骤分散到所有 10 个正在运行的构建器 pod。

我怀疑这是因为我们的项目目前存在于 monorepo 中,并且在项目的根级别使用相同的 Dockerfile.dev 来构建所有图像 (在构建时使用 {{1} })

  1. 我的怀疑是否正确?很难说,但它似乎是基于 Dockerfile 上下文的 buildx 负载平衡。如果是这样,是否可以覆盖此行为?

  2. 或者,有没有办法手动选择 buildx 节点?很容易编写一个选择器,该选择器在现有的远程节点上循环以分散构建负载

解决方法

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 上。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...