You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bazel container_image配置grpc_health_probe后探针找不到文件如何解决?

问题根因
  • 拼写错误:symlinks配置中的源文件名写错,你写的grpc_health_prob-linux-amd64少了字母e,正确名称是grpc_health_probe-linux-amd64
  • symlinks参数方向错误:rules_docker的container_image的symlinks字段格式为{容器内符号链接路径: 链接指向的目标文件路径},你当前的写法完全写反了
  • cmd参数用法错误:container_image的cmd字段设置的是容器启动时的默认命令,不是Dockerfile中RUN类的构建阶段命令,你写的chmod +x和apk add不会在镜像构建阶段执行,只会在容器启动时运行,还会覆盖原Go应用的启动逻辑
  • 文件路径不匹配:files字段引入的二进制默认会放到镜像的/workspace目录下,你没有指定路径的情况下符号链接找不到对应文件
正确配置方案

不需要用到file_map参数即可实现,步骤如下:

第一步:预处理健康探针二进制权限和名称

增加genrule规则提前处理二进制的执行权限和命名,避免后续在镜像内改权限:

genrule(
    name = "grpc_health_probe_bin",
    srcs = ["grpc_health_probe-linux-amd64"],
    outs = ["grpc_health_probe"],
    cmd = "cp $< $@ && chmod +x $@",
    executable = True,
)

第二步:处理构建阶段依赖安装

你需要的apk add git属于镜像构建阶段操作,用container_run_and_commit_layer实现:

load("@io_bazel_rules_docker//container:container.bzl", "container_run_and_commit_layer")

container_run_and_commit_layer(
    name = "add_git_layer",
    base = ":go_auth_image",
    commands = [
        "apk add --no-cache git",
    ],
)

注意:如果你的go_image用的是distroless基础镜像,本身没有apk包管理器,需要提前把git打到基础镜像中,或者将go_image的基础镜像更换为alpine版本。

第三步:调整container_image配置

container_image(
    name = "go_auth_api",
    visibility = ["//visibility:public"],
    base = ":go_auth_image",
    layers = [":add_git_layer"],
    ports = ["5001", "5002"],
    files = [":grpc_health_probe_bin"],
    symlinks = {
        "/bin/grpc_health_probe": "/workspace/grpc_health_probe",
    },
)

内容的提问来源于stack exchange,提问作者a11hard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:15:05