
Bazelでコンテナイメージを作成しPushする際に、まとめてPushする方法です。
distroless/BUILD at main · GoogleContainerTools/distroless · GitHub を参考にしました。
事前準備
git clone https://github.com/bazelbuild/examples cd examples/cpp-tutorial/stage2
設定
以下の例では、レジストリ、名前、タグが異なる8種類のタグを同じイメージにつけて8個同時にPushするための設定です。
〜イメージの中身を生成するBAZEL rule(省略)〜
load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_bundle")
# container image作成
container_image(
name = "image",
base = ":go_image",
files = [":test"],
entrypoint = ["/test"],
)
## 共通で定義している変数を取得
REGISTRYS = ("registry-a", "registry-b")
IMAGES = ("test1", "test2")
TAGS = ("latest","latest-2")
## Push先のイメージ名のリストを作成(プロジェクト数でループする)
ALL = {
registry + "/" + image + ":" + tag : ":image"
for registry in REGISTRYS
for image in IMAGES
for tag in TAGS
}
## 設定したALLの中身をまとめて実行できるようにする
container_bundle(
name = "all",
images = ALL,
)
## まとめてdocker pushを行うルールをロードしPushを行う
load("@io_bazel_rules_docker//contrib:push-all.bzl", "container_push")
container_push(
name = "push-all",
bundle = ":all",
format = "Docker",
)
あとは bazel run //:push-all と実行することで全てのイメージを同時にPushすることができるようになります。
distroless/BUILD at main · GoogleContainerTools/distroless · GitHub をみると異なるcontainer_imageを 同時にPushする例ものっています。
なお現在たくさんのイメージをPushすると失敗するバグがあったようで、参考にしたDistrolessのBAZELファイルでは sequential = True を付与して実行しています。
Failed while running push-all · Issue #525 · bazelbuild/rules_docker · GitHub
container_push(
name = "publish",
bundle = ":all",
format = "Docker",
# Push images sequentially, to avoid a bug in rules_docker related to
# pushing many images in parallel.
# https://github.com/bazelbuild/rules_docker/issues/525
sequential = True,
)