container_install_pkgs supports chaining installation of packages (#50)
Previously rule could not be used if base was also produced by container_install_pkgs.
Also added some interesting examples/tests of how packages can be installed.
diff --git a/WORKSPACE b/WORKSPACE
index 0d545e8..243b245 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -111,6 +111,12 @@
url = "https://bazel.build/bazel-release.pub.gpg",
)
+http_file(
+ name = "debian_docker_gpg",
+ sha256 = "1500c1f56fa9e26b9b8f42452a553675796ade0807cdce11975eb98170b3a570",
+ url = "https://download.docker.com/linux/debian/gpg",
+)
+
# Use http_archive rule instead of git_repository rule
# https://docs.bazel.build/versions/master/be/workspace.html#git_repository
http_archive(
diff --git a/rules/docker_config.bzl b/rules/docker_config.bzl
index 6239de4..6dd0090 100644
--- a/rules/docker_config.bzl
+++ b/rules/docker_config.bzl
@@ -152,7 +152,7 @@
".tar.xz",
]
-def container_install_pkgs(name, base, packages, additional_repos, keys):
+def container_install_pkgs(name, base, packages, additional_repos = [], keys = [], tags = []):
"""Macro to download and install deb packages in a container.
The output image with packages installed will have name {name}.tar.
@@ -165,6 +165,7 @@
additional_repos: list of additional debian package repos to use,
in sources.list format.
keys: label of additional gpg keys to use while downloading packages.
+ tags: tags to pass down to generated rules
"""
# Create an intermediate image which includes additional gpg keys.
@@ -181,6 +182,7 @@
additional_repos = additional_repos,
image_tar = ":" + name + "_with_keys.tar",
packages = packages,
+ tags = tags,
)
# Execute the package installation script in the container and commit the
@@ -190,7 +192,8 @@
name = name,
image_tar = base,
installables_tar = ":" + name + "_pkgs.tar",
- output_image_name = name,
+ output_image_name = "bazel/" + native.package_name() + ":" + name,
+ tags = tags,
)
def _docker_toolchain_autoconfig_impl(ctx):
diff --git a/test/container/BUILD b/test/container/BUILD
index 9c1604a..e00c038 100644
--- a/test/container/BUILD
+++ b/test/container/BUILD
@@ -15,3 +15,107 @@
licenses(["notice"]) # Apache 2.0
package(default_visibility = ["//visibility:public"])
+
+load("@base_images_docker//package_managers:download_pkgs.bzl", "download_pkgs")
+load("@base_images_docker//package_managers:install_pkgs.bzl", "install_pkgs")
+load("@base_images_docker//package_managers:apt_key.bzl", "add_apt_key")
+
+load("@bazel_toolchains//rules:docker_config.bzl", "container_install_pkgs")
+
+# This file contains some sample targets that excersise the container rules
+# We just keep these as examples that should not break (unless indicated)
+# with changes.
+
+# The two targets below test that container_install_pkgs can sequentially
+# install packages
+container_install_pkgs(
+ name = "rbe-test-xenial-base",
+ base = "@official_xenial//image",
+ packages = [
+ "curl",
+ "gcc",
+ "git",
+ "openjdk-8-jdk",
+ "python-dev",
+ "unzip",
+ "wget",
+ "zip",
+ ],
+)
+
+container_install_pkgs(
+ name = "rbe-test-xenial-with-pkgs",
+ base = ":rbe-test-xenial-base.tar",
+ packages = [
+ "bazel",
+ ],
+ additional_repos = [
+ "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8",
+ ],
+ keys = [
+ "@bazel_gpg//file",
+ ],
+)
+
+# The target below (marked manual, should not be run by CI) shows a case of a
+# package that cannot be installed because downloading it requires an additional
+# package (apt-transport-https) not present in the base.
+container_install_pkgs(
+ name = "docker-noprereq-fails",
+ additional_repos = [
+ "deb [arch=amd64] https://download.docker.com/linux/debian jessie stable",
+ ],
+ base = "@debian8//image",
+ packages = [
+ "docker-ce",
+ "apt-transport-https",
+ ],
+ keys = [
+ "@debian_docker_gpg//file",
+ ],
+ tags = ["manual"],
+)
+
+# The targets below exemplify how to install a package whose download
+# has pre-requisites in a way that the final container in which the
+# package is installed does not need the pre-requisites
+download_pkgs(
+ name = "docker-prereq-packages",
+ image_tar = "@debian8//image",
+ packages = [
+ "apt-transport-https",
+ ],
+)
+
+install_pkgs(
+ name = "docker-prereq-test",
+ image_tar = "@debian8//image",
+ installables_tar = ":docker-prereq-packages.tar",
+ output_image_name = "bazel/test/container:docker-prereq-test",
+)
+
+add_apt_key(
+ name = "test-docker-with-keys",
+ image = ":docker-prereq-test.tar",
+ keys = [
+ "@debian_docker_gpg//file",
+ ],
+)
+
+download_pkgs(
+ name = "test-docker-packages",
+ additional_repos = [
+ "deb [arch=amd64] https://download.docker.com/linux/debian jessie stable",
+ ],
+ image_tar = ":test-docker-with-keys.tar",
+ packages = [
+ "docker-ce",
+ ],
+)
+
+install_pkgs(
+ name = "docker",
+ image_tar = "@debian8//image",
+ installables_tar = ":test-docker-packages.tar",
+ output_image_name = "bazel/test/container:docker",
+)