blob: 63f57ccaac085ad877ffd683f8b28dc6ba4bbae3 [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.
"""Convert a docker save JSON files to a BUILD file so docker_import can read it."""
import gzip
import json
import os
import os.path
import shutil
import sys
import tarfile
def convert_manifest(infile, outfile):
with open(infile, "r") as fp:
json_obj = json.load(fp)
dirname = os.path.dirname(infile)
dir = os.path.relpath(dirname, os.path.dirname(outfile))
config = json_obj[0]["Config"]
layers = json_obj[0]["Layers"]
with open(outfile, "w") as of:
of.write( """
load("@io_bazel_rules_docker//docker:docker.bzl", "docker_import")
docker_import(
name = "image",
layers = [%s],
config = "%s/%s",
visibility = ["//visibility:public"],
)
""" % (",".join(['"%s/%s.tgz"' % (dir, os.path.dirname(l)) for l in layers]), dir, config))
def extract_image(image, directory):
with tarfile.open(image) as tar:
tar.extractall(directory)
for f in os.listdir(directory):
d = os.path.join(directory, f)
l = os.path.join(d, "layer.tar")
if os.path.isdir(d) and os.path.exists(l):
with gzip.open(d + ".tgz", "wb") as f_out, open(l, "rb") as f_in:
shutil.copyfileobj(f_in, f_out)
os.remove(l)
if __name__ == '__main__':
if len(sys.argv) < 4:
sys.stderr.write("Usage: %s infile directory build_file\n" % sys.argv[0])
sys.exit(1)
extract_image(sys.argv[1], sys.argv[2])
convert_manifest(os.path.join(sys.argv[2], "manifest.json"), sys.argv[3])