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