Bazel starlark rules for building container images from py_binary using
@rules_pycross ✨.
Provides:
load("@pycross_image//bazel/rules:oci.bzl", "py_image")- image rule compatible with @rules_oci
load("@pycross_image//bazel/rules:docker.bzl", "py_image")- image rule compatible with @rules_docker
See [releases] page for an http_archive of the latest @pycross_image.
Examples:
A few notes about the workspace setup:
- It's divided into "steps" based on load statement dependencies.
step1.bzlonly depends on things declared inrepositories.bzl,step2.bzldepends on things declared instep1.bzl, etc (this pattern is from tensorflow). - Your workspace may already contain some of these dependencies. Also, selected external workspace names may be differ from yours. Use the example as a study guide rather than canonical reference.
- The examples are only tested with the older
WORKSPACE. The rules may not be compatible withbzlmodyet.
graph TD;
pypi[(pypi)]
DefaultInfo[[DefaultInfo]]
numpy{{numpy}}
grpclib{{grpclib}}
subgraph linux_x86_64
image.tar-->image;
image-->app_layer;
image-->site_packages_layer;
image-->interpreter_layer;
app_layer-->DefaultInfo;
site_packages_layer-->DefaultInfo;
interpreter_layer-->DefaultInfo;
end
DefaultInfo--transition :linux_x86_64-->pycross_binary;
pycross_binary-->py_binary;
py_binary-->numpy;
py_binary-->grpclib;
numpy-.->numpy-cp310-macosx_arm64.whl
numpy-.->numpy-cp310-manylinux_x86_64.whl
grpclib-.->grpclib.whl
numpy-cp310-macosx_arm64.whl-->pypi
numpy-cp310-manylinux_x86_64.whl-->pypi
subgraph zig_toolchain
grpclib.whl-->grpclib-tar.gz
end
grpclib-tar.gz-->pypi
style pypi fill:#3171b2,stroke:#333
style numpy fill:#5d97d2,stroke:#3171b2,color:black
style grpclib fill:#5d97d2,stroke:#3171b2,color:black
style grpclib.whl stroke:#bc082b
style numpy-cp310-manylinux_x86_64.whl stroke:#bc082b
style numpy-cp310-macosx_arm64.whl stroke:#bb22d8
style linux_x86_64 stroke:#bc082b,fill:none
In this example the py_binary rule has deps on two python wheels:
numpyhas a binary wheel available from pypi for both the darwin and linux platforms.grpclibonly has a source distribution available.
The pycross_binary rule transitions from the host platform to :linux_x86_64.
- the transition affects how
@rules_pycrossfetches wheels. If the binary distribution is available, take it. - if the binary distribution is not available, compile from source using (in
this case, with
zigand@hermetic_cc_toolchains).
The image is partitioned into three tar layers by matching against filename patterns (see rule implementation for details).