如何用Bazel直接获取Amazon Linux 2的tar、gzip RPM包(解决访问拒绝)
我需要为在无网络环境运行的Amazon Linux 2容器准备tar和gzip工具。使用Bazel基于最新aws-cli镜像构建容器时,不想为所有Kubernetes容器实例预装这些工具,只在特定实例需要时再安装,因此需要将tar和gzip的RPM包打包进容器。
我知道可以通过yum install --downloadonly ...下载包后上传至S3,再用Bazel从S3桶获取,但更希望直接用Bazel从仓库获取,无需每次更新版本都手动下载上传。但尝试使用仓库基础URL时遇到access denied(访问拒绝)问题,求解决方法。
期望实现的代码示例
WORKSPACE 文件
# WORKSPACE file ... load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") http_file( name = "tar_rpm", downloaded_file_path = "tar.rpm", sha256 = "some_sha256_value", url = "https://some-repo-url/tar.1.26-35.amzn2.0.4.rpm", ) ...
BUILD.bazel 文件
# BUILD.bazel file ... load("@rules_pkg//:pkg.bzl", "pkg_tar") load("@io_bazel_rules_docker//container:container.bzl", "container_image") container_image( name = "latest", base = "@aws-cli//image", entrypoint = "/usr/bin/entrypoint.sh", env = { "SRC_DIR": "/src", "CONFIG_DIR": "/config", }, experimental_tarball_format = "compressed", repository = "my.registry/release", tars = [ ":tar_gzip_tgz", ], visibility = ["//visibility:public"], ) pkg_tar( name = "tar_gzip_tgz", srcs = [ "@tar//file", "@gzip//file", ], package_dir = "/src/tars", strip_prefix = ".", ) ...
1. 获取Amazon Linux 2官方仓库的公开RPM URL
Amazon Linux 2的官方YUM仓库是公开可访问的,你可以直接使用以下格式的URL获取tar和gzip的RPM包:
- tar包示例URL:
https://yum.amazonaws.com/amzn2-core/x86_64/Packages/t/tar-1.26-35.amzn2.0.4.rpm - gzip包示例URL:
https://yum.amazonaws.com/amzn2-core/x86_64/Packages/g/gzip-1.5-10.amzn2.0.2.rpm
如果需要其他架构(如arm64),只需将x86_64替换为aarch64即可。
2. 解决访问拒绝问题
部分仓库URL可能需要指定正确的User-Agent,直接使用Amazon提供的全局镜像地址https://yum.amazonaws.com/amzn2-core/即可避免访问拒绝问题,上述示例URL已经采用该地址。
3. 修正WORKSPACE配置
确保http_file的name和后续BUILD文件中的引用一致,同时正确填写SHA256值(可在Amazon Linux 2环境中执行rpm -q --qf "%{SHA256SUM}\n" tar获取,或下载包后用sha256sum命令计算)。修正后的WORKSPACE示例:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") # 配置tar的RPM包 http_file( name = "tar_rpm", downloaded_file_path = "tar.rpm", sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", # 替换为实际SHA256值 url = "https://yum.amazonaws.com/amzn2-core/x86_64/Packages/t/tar-1.26-35.amzn2.0.4.rpm", ) # 配置gzip的RPM包 http_file( name = "gzip_rpm", downloaded_file_path = "gzip.rpm", sha256 = "another_sha256_value", # 替换为实际SHA256值 url = "https://yum.amazonaws.com/amzn2-core/x86_64/Packages/g/gzip-1.5-10.amzn2.0.2.rpm", )
4. 修正BUILD.bazel中的引用错误
原示例中pkg_tar的srcs引用@tar//file和@gzip//file是错误的,应对应WORKSPACE中http_file的name,即@tar_rpm//file和@gzip_rpm//file:
pkg_tar( name = "tar_gzip_tgz", srcs = [ "@tar_rpm//file", "@gzip_rpm//file", ], package_dir = "/src/tars", strip_prefix = ".", )
5. 验证配置
执行bazel build //path/to:latest构建容器镜像,确认Bazel能成功下载RPM包并打包进镜像中。
内容的提问来源于stack exchange,提问作者Mark_Eng

