rules_oci
v2.0.1
published 1 month ago
305 stars
159 forks
10 watchers
Apache License 2.0
public
1 assets
10,339,182 downloads
105 KB
Compatability level 1
rL+PQOBi9wf4dU6RTcsAE4A8bl42edPgW1can1x+C0M=
Maintained byAlex Eagle,Şahin Yort
v2.0.1
October 13, 2024

Using bzlmod with Bazel 6 or later:

  1. Add common --enable_bzlmod to .bazelrc.

  2. Add to your MODULE.bazel file:

bazel_dep(name = "rules_oci", version = "2.0.1")
# For testing, we also recommend https://registry.bazel.build/modules/container_structure_test

oci = use_extension("@rules_oci//oci:extensions.bzl", "oci")

# Declare external images you need to pull, for example: 
oci.pull(
    name = "distroless_base",
    # 'latest' is not reproducible, but it's convenient.
    # During the build we print a WARNING message that includes recommended 'digest' and 'platforms'
    # values which you can use here in place of 'tag' to pin for reproducibility.
    tag = "latest",
    image = "gcr.io/distroless/base",
    platforms = ["linux/amd64"],
)

# For each oci.pull call, repeat the "name" here to expose them as dependencies.
use_repo(oci, "distroless_base")

Using WORKSPACE:


load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_oci",
    sha256 = "acbf8f40e062f707f8754e914dcb0013803c6e5e3679d3e05b571a9f5c7e0b43",
    strip_prefix = "rules_oci-2.0.1",
    url = "https://github.com/bazel-contrib/rules_oci/releases/download/v2.0.1/rules_oci-v2.0.1.tar.gz",
)

load("@rules_oci//oci:dependencies.bzl", "rules_oci_dependencies")

rules_oci_dependencies()

load("@rules_oci//oci:repositories.bzl", "oci_register_toolchains")

oci_register_toolchains(name = "oci")

# You can pull your base images using oci_pull like this:
load("@rules_oci//oci:pull.bzl", "oci_pull")

oci_pull(
    name = "distroless_base",
    digest = "sha256:ccaef5ee2f1850270d453fdf700a5392534f8d1a8ca2acda391fbb6a06b81c86",
    image = "gcr.io/distroless/base",
    platforms = [
        "linux/amd64",
        "linux/arm64",
    ],
)

What's Changed

Full Changelog: https://github.com/bazel-contrib/rules_oci/compare/v2.0.0...v2.0.1

Deps:
Assets:

Bazel rules for OCI container images

Bazel rules based on the Open Containers Initiative: https://opencontainers.org/

Please let us know about your success stories on our adoption discussion! #299

Need help? This ruleset has support provided by Aspect Build.

Comparison with rules_docker

This ruleset is not intended as a complete replacement for rules_docker! Many use cases can be accomodated, and we know that many users have completely replaced rules*docker. You can find a migration guide at https://docs.aspect.build/guides/rules_oci_migration. However, some other use cases such as container_run_and*\* rules have no equivalent.

rules_docker was largely unmaintained for 18 months, and as of October 2023 it has been archived. See bazelbuild/rules_docker#2038. You might still decide to use rules_docker, and perhaps even sign up as a maintainer so that it may be un-archived.

We started from first principles and avoided some pitfalls we learned from rules_docker:

  • Use a toolchain consisting of off-the-shelf, pre-built layer and container manipulation tools.
  • Don't write language-specific rules, as we cannot be experts on all languages, nor can users deal with the versioning issues that come with dependencies we would be forced to take on the rules for those languages.
  • Don't be docker-specific, now that it has a commercial license and other container runtimes exist (podman for example).
  • Use our toolchain hermetically: don't assume there is a docker pre-installed on the machine.
  • Keep a tight complexity budget for the project so we are able to commit to effective maintenance.

Installation

See the install instructions on the release notes: https://github.com/bazel-contrib/rules_oci/releases

To use a commit rather than a release, you can point at any SHA of the repo.

With bzlmod, you can use archive_override or git_override. For WORKSPACE, you modify the http_archive call; for example to use commit abc123 with a WORKSPACE file:

  1. Replace url = "https://github.com/bazel-contrib/rules_oci/releases/download/v0.1.0/rules_oci-v0.1.0.tar.gz" with a GitHub-provided source archive like url = "https://github.com/bazel-contrib/rules_oci/archive/abc123.tar.gz"
  2. Replace strip_prefix = "rules_oci-0.1.0" with strip_prefix = "rules_oci-abc123"
  3. Update the sha256. The easiest way to do this is to comment out the line, then Bazel will print a message with the correct value.

Note that GitHub source archives don't have a strong guarantee on the sha256 stability, see https://github.blog/2023-02-21-update-on-the-future-stability-of-source-code-archives-and-hashes

Usage

rules_oci does not contain language-specific rules, but we do have limited documentation on how to accomplish typical tasks.

Note

Your language not listed above? Please contribute engineering resources or financially through our Sponsor link!

There are some generic examples of usage in the examples folder. Note that these examples rely on the setup code in the /WORKSPACE file in the root of this repo.

Public API Docs

Install system packages

Construct image layers

  • oci_image Build an OCI compatible container image.
  • oci_image_index Build a multi-architecture OCI compatible container image.
  • oci_load Loads an oci_image into a container daemon. Can optionally produce a loadable tarball.

Pull and Push

  • oci_pull Pull image layers using Bazel's downloader. Falls back to using curl in some cases.
  • oci_push Push an oci_image or oci_image_index to a remote registry.

Testing

  • We recommend container_structure_test to run tests against an oci_image target (with driver="docker") or an oci_tarball target (with driver="tar").

Signing

Warning

Signing images is a developer preview, not part of public API yet.

  • cosign_sign: Sign an oci_image using cosign binary at a remote registry.
  • cosign_attest Add an attachment to an oci_image at a remote registry using cosign.

3rd Party Extensions/Tools

  • ociupdate: CLI and basic module extension to help with automating updates to image digests for ECR-based images with immutable tags.