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
相关产品推荐
相关产品推荐

