blob: e011f025f3e643a54d569e40e10508b53f17c877 [file] [log] [blame]
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tools for dealing with Docker Image layers."""
load(":list.bzl", "reverse")
load(":path.bzl", _get_runfile_path="runfile")
def get_from_target(unused_ctx, target):
if hasattr(target, "docker_layers"):
return target.docker_layers
else:
# TODO(mattmoor): Use containerregistry.client's FromTarball
# to create an entry from a tarball base image.
return []
def assemble(ctx, layers, tags_to_names, output):
"""Create the full image from the list of layers."""
layers = [l["layer"] for l in layers]
args = [
"--output=" + output.path,
] + [
"--tags=" + tag + "=@" + tags_to_names[tag].path
for tag in tags_to_names
] + ["--layer=" + l.path for l in layers]
inputs = layers + tags_to_names.values()
ctx.action(
executable = ctx.executable.join_layers,
arguments = args,
inputs = inputs,
outputs = [output],
mnemonic = "JoinLayers"
)
def incremental_load(ctx, layers, images, output):
"""Generate the incremental load statement."""
ctx.template_action(
template = ctx.file.incremental_load_template,
substitutions = {
"%{load_statements}": "\n".join([
"incr_load '%s' '%s' '%s'" % (_get_runfile_path(ctx, l["name"]),
_get_runfile_path(ctx, l["id"]),
_get_runfile_path(ctx, l["layer"]))
# The last layer is the first in the list of layers.
# We reverse to load the layer from the parent to the child.
for l in reverse(layers)]),
"%{tag_statements}": "\n".join([
"tag_layer '%s' '%s' '%s'" % (
img,
_get_runfile_path(ctx, images[img]["name"]),
_get_runfile_path(ctx, images[img]["id"]))
for img in images
])
},
output = output,
executable = True)
tools = {
"incremental_load_template": attr.label(
default=Label("//tools/build_defs/docker:incremental_load_template"),
single_file=True,
allow_files=True),
"join_layers": attr.label(
default=Label("//tools/build_defs/docker:join_layers"),
cfg="host",
executable=True,
allow_files=True)
}