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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:40:55