Bazel和Docker镜像:@go_image_base//image的作用是什么?

3

我有一个 src/BUILD.bazel 文件(在 MacOs 上):

load("@io_bazel_rules_docker//go:image.bzl", "go_image")
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
load("@io_bazel_rules_docker//container:container.bzl", "container_image")

go_image(
    name = "bazel_docker_image",
    srcs = ["main.go"],
    pure = "on",
)

以下方案可使工作无误:

bazel build //src:bazel_docker_image

显示:

INFO: Analyzed target //src:bazel_docker_image (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src:bazel_docker_image up-to-date:
    bazel-bin/src/bazel_docker_image-layer.tar
INFO: Elapsed time: 2.361s, Critical Path: 0.03s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action

但是tar文件(可以作为镜像导入到docker中)仅包含静态链接的任务。该镜像无法作为容器运行,因为它不包含其他内容。
/usr/lib/libSystem.B.dylib

那么,@go_image_base//image有什么意义呢?我认为它应该生成一个包含所有必需库、有效入口点等的基本完整独立映像。

如果查看bazel-bin/external/go_image_static/image/000.tar.gz.nogz,会发现Bazel似乎生成了一个完整的映像,更接近于Bazel文档所建议的输出。这是怎么回事?

此外,Bazel文档还提到:

To address this, we publish variants of the distroless runtime images
tagged :debug, which are the exact-same images, but with additions
such as busybox to make debugging easier.

但是没有提供示例。

这时候,我最好从alpine制作一个容器镜像,并自己完成所有操作。总的来说,我真的希望能解决这个问题,因为Bazel通常会让这种Docker操作变得更加简单。

1个回答

0

这个问题正在被回答(我希望能够解决)在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接