diff options
author | Yuki Yugui Sonoda <yugui@yugui.jp> | 2015-12-17 22:21:51 +0000 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2015-12-21 21:34:51 +0000 |
commit | fb939b5c058f0f4b9f4c354ba277f9bfee2de210 (patch) | |
tree | 7133ce786862081c8f6301d50fd4b7de14a30dab /tools/build_defs/docker/docker.bzl | |
parent | 0d32f35a05388d09e07305aac519014b92e8931a (diff) |
Support LABEL in docker_build rule
Allows users to associate custom metadata with docker images.
Discussion:
https://groups.google.com/d/msg/bazel-dev/FTQVg2U3CvQ/X-8RJ01_AgAJ
--
Change-Id: Ia9f6ceb1dd99aa91cf0c41f3d7afc447ab5792e5
Reviewed-on: https://bazel-review.googlesource.com/#/c/2350/
MOS_MIGRATED_REVID=110489115
Diffstat (limited to 'tools/build_defs/docker/docker.bzl')
-rw-r--r-- | tools/build_defs/docker/docker.bzl | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/tools/build_defs/docker/docker.bzl b/tools/build_defs/docker/docker.bzl index 395f0277d0..eb454a2b63 100644 --- a/tools/build_defs/docker/docker.bzl +++ b/tools/build_defs/docker/docker.bzl @@ -133,23 +133,43 @@ def _get_base_artifact(ctx): fail("base attribute should be a single tar file.") return ctx.files.base[0] +def _serialize_dict(dict_value): + return ",".join(["%s=%s" % (k, dict_value[k]) for k in dict_value]) + def _metadata_action(ctx, layer, name, output): """Generate the action to create the JSON metadata for the layer.""" rewrite_tool = ctx.executable._rewrite_tool - env = ctx.attr.env + + label_file_dict = dict() + for i in range(len(ctx.files.label_files)): + fname = ctx.attr.label_file_strings[i] + file = ctx.files.label_files[i] + label_file_dict[fname] = file + + labels = dict() + for l in ctx.attr.labels: + fname = ctx.attr.labels[l] + if fname[0] == '@': + labels[l] = "@" + label_file_dict[fname[1:]].path + else: + labels[l] = fname + args = [ "--output=%s" % output.path, "--layer=%s" % layer.path, "--name=@%s" % name.path, "--entrypoint=%s" % ",".join(ctx.attr.entrypoint), "--command=%s" % ",".join(ctx.attr.cmd), - "--env=%s" % ",".join(["%s=%s" % (k, env[k]) for k in env]), + "--labels=%s" % _serialize_dict(labels), + "--env=%s" % _serialize_dict(ctx.attr.env), "--ports=%s" % ",".join(ctx.attr.ports), "--volumes=%s" % ",".join(ctx.attr.volumes) ] if ctx.attr.workdir: args += ["--workdir=" + ctx.attr.workdir] inputs = [layer, rewrite_tool, name] + if ctx.attr.label_files: + inputs += ctx.files.label_files base = _get_base_artifact(ctx) if base: args += ["--base=%s" % base.path] @@ -302,11 +322,15 @@ docker_build_ = rule( "entrypoint": attr.string_list(), "cmd": attr.string_list(), "env": attr.string_dict(), + "labels": attr.string_dict(), "ports": attr.string_list(), # Skylark doesn't support int_list... "volumes": attr.string_list(), "workdir": attr.string(), "repository": attr.string(default="bazel"), # Implicit dependencies. + "label_files": attr.label_list( + allow_files=True), + "label_file_strings": attr.string_list(), "_build_layer": attr.label( default=Label("//tools/build_defs/pkg:build_tar"), cfg=HOST_CFG, @@ -447,6 +471,13 @@ def docker_build(**kwargs): """ if "cmd" in kwargs: kwargs["cmd"] = _validate_command("cmd", kwargs["cmd"]) + for reserved in ["label_files", "label_file_strings"]: + if reserved in kwargs: + fail("reserved for internal use by docker_build macro", attr=reserved) + if "labels" in kwargs: + files = sorted(set([v[1:] for v in kwargs["labels"].values() if v[0] == '@'])) + kwargs["label_files"] = files + kwargs["label_file_strings"] = files if "entrypoint" in kwargs: kwargs["entrypoint"] = _validate_command("entrypoint", kwargs["entrypoint"]) docker_build_(**kwargs) |