フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【Bazel】コンテナイメージのPushをまとめて行う方法

f:id:lirlia:20211010195102p:plain

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,
)