#!/usr/bin/env python2.7 # Copyright 2017, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """Upload docker images to Google Container Registry.""" from __future__ import print_function import argparse import atexit import os import shutil import subprocess import tempfile argp = argparse.ArgumentParser(description='Run interop tests.') argp.add_argument('--gcr_path', default='gcr.io/grpc-testing', help='Path of docker images in Google Container Registry') argp.add_argument('--gcr_tag', default='latest', help='the tag string for the images to upload') argp.add_argument('--with_files', default=[], nargs='+', help='additional files to include in the docker image') argp.add_argument('--with_file_dest', default='/var/local/image_info', help='Destination directory for with_files inside docker image') argp.add_argument('--images', default=[], nargs='+', help='local docker images in the form of repo:tag ' + '(i.e. grpc_interop_java:26328ad8) to upload') argp.add_argument('--keep', action='store_true', help='keep the created local images after uploading to GCR') args = argp.parse_args() def upload_to_gcr(image): """Tags and Pushes a docker image in Google Containger Registry. image: docker image name, i.e. grpc_interop_java:26328ad8 A docker image image_foo:tag_old will be uploaded as /image_foo: after inserting extra with_files under with_file_dest in the image. The original image name will be stored as label original_name:"image_foo:tag_old". """ tag_idx = image.find(':') if tag_idx == -1: print('Failed to parse docker image name %s' % image) return False new_tag = '%s/%s:%s' % (args.gcr_path, image[:tag_idx], args.gcr_tag) lines = ['FROM ' + image] lines.append('LABEL original_name="%s"' % image) temp_dir = tempfile.mkdtemp() atexit.register(lambda: subprocess.call(['rm', '-rf', temp_dir])) # Copy with_files inside the tmp directory, which will be the docker build # context. for f in args.with_files: shutil.copy(f, temp_dir) lines.append('COPY %s %s/' % (os.path.basename(f), args.with_file_dest)) # Create a Dockerfile. with open(os.path.join(temp_dir, 'Dockerfile'), 'w') as f: f.write('\n'.join(lines)) build_cmd = ['docker', 'build', '--rm', '--tag', new_tag, temp_dir] subprocess.check_output(build_cmd) if not args.keep: atexit.register(lambda: subprocess.call(['docker', 'rmi', new_tag])) # Upload to GCR. if args.gcr_path: subprocess.call(['gcloud', 'docker', '--', 'push', new_tag]) return True for image in args.images: upload_to_gcr(image)