0

I have the following bazel definition:

docker/project/BUILD.bazel

load("@io_bazel_rules_docker//container:container.bzl", "container_image")
load("@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs")
load("@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs")
load("@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_commit")
load("@io_bazel_rules_docker//container:container.bzl", "container_image", "container_layer")

package(default_visibility = ["//visibility:public"])

download_pkgs(
    name = "apt_pkgs_installables",
    image_tar = "@ubuntu_bionic_base_image//image",
    packages = [
        "build-essential",
        "libedit-dev",
        "libpq-dev",
        "libpython3.7",
        "libpython3.7-dev",
        "python",
        "python-dev",
        "python3.7",
        "python3-dev",
        "python3-pip",
        "python3-setuptools",
        "python3-venv",
        "python3-wheel",
    ],
)

install_pkgs(
    name = "apt_pkgs",
    image_tar = "@ubuntu_bionic_base_image//image",
    installables_tar = ":apt_pkgs_installables.tar",
    output_image_name = "apt_pkgs_image",
)

container_run_and_commit(
    name = "python3_extras",
    commands = [
        "ln -s /usr/share/doc/python3-venv /usr/bin/python3-venv",
        "ln -s --force /usr/bin/python3 /usr/bin/python",
        "ln -s --force /usr/bin/pip3 /usr/bin/pip",
        "pip install behave==1.2.6",
        "pip install kubernetes==21.7.0",
        "pip install polling==0.3.2",
        "pip install jinja2==3.0.3",
    ],
    image = ":apt_pkgs.tar",
)

container_image(
    name = "project-base",
    base = "@ubuntu_bionic_base_image//image",
    visibility = ["//visibility:public"],
    tars = [
        "python3_extras_commit.tar"
    ]
)

container_layer(
    name = "project-src",
    data_path = "//project",
    directory = "/opt/app/",
    files = [
        "//project",
    ],
    mode = "0o755",
)

container_image(
    name = "project",
    base = "@ubuntu_bionic_base_image//image",
    layers = [
        ":project-src"
    ],
    tars = [
        "python3_extras_commit.tar",
    ]
)

The project structure is:

.
├── BUILD.bazel
├── README.md
├── WORKSPACE
├── docker
│   ├── BUILD.bazel
│   └── project
│       └── BUILD.bazel
├── go.mod
├── go.sum
├── project
│   ├── BUILD.bazel
│   ├── Makefile
│   ├── behave.ini

project/BUILD.bazel have a filegroup:

package(default_visibility = ["//visibility:public"])

filegroup(
    name = "project",
    srcs = [
        "Makefile",
        "behave.ini",
    ],
)

The expected output is to have the Makefile and bahave.ini files under /opt/app/ declared in project-src container_layer, but the final docker image does not have these files.

bazel 4.0.0

Build command:

bazel build //docker/project:project --verbose_failures --sandbox_debug
Vishrant
  • 15,456
  • 11
  • 71
  • 120

2 Answers2

0

It turns out the Bazel command should be:

bazel run //docker/project:project --verbose_failures --sandbox_debug

and base for container_image project should be :python3_extras_commit.tar

Vishrant
  • 15,456
  • 11
  • 71
  • 120
0

container_run_and_commit produces a new image, so you don't need to create another image from it. The most direct way to fix this is removing project-base and use python3_extras_commit.tar wherever you're using it. Also, change the base for project to python3_extras_commit.tar:

container_image(
    name = "project",
    base = ":python3_extras_commit.tar",
    layers = [
        ":project-src"
    ],
)

If you want the installed apt packages as a separate layer for some reason, use container_run_and_commit_layer instead. Note that the result of that goes in layers, not tars. However, that will not have the apt packages from download_pkgs because those will be a separate layer, so you'll have to manage those separately if you go that route.

For reference, rules_docker has lots of good examples. testing/examples/run_instruction_arbitrary/BUILD shows most of these pieces.

Brian Silverman
  • 3,085
  • 11
  • 13
  • Thanks Brain for answering it, the issue was with the bazel command, after I used `run` instead of `build` the files were getting included, however, the `base` also needs to be changed to include the `container_run_and_commit` layer. – Vishrant Feb 17 '22 at 22:50