Created
June 12, 2016 21:31
-
-
Save pascalandy/da8ff83317ccca847e86cdd467e519aa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
from common import ComposeFile | |
import os | |
import subprocess | |
import time | |
registry = os.environ.get("DOCKER_REGISTRY") | |
if not registry: | |
print("Please set the DOCKER_REGISTRY variable, e.g.:") | |
print("export DOCKER_REGISTRY=jpetazzo # use the Docker Hub") | |
print("export DOCKER_REGISTRY=localhost:5000 # use a local registry") | |
exit(1) | |
# Get the name of the current directory. | |
project_name = os.path.basename(os.path.realpath(".")) | |
# Generate a Docker image tag, using the UNIX timestamp. | |
# (i.e. number of seconds since January 1st, 1970) | |
version = str(int(time.time())) | |
# Execute "docker-compose build" and abort if it fails. | |
subprocess.check_call(["docker-compose", "-f", "docker-compose.yml", "build"]) | |
# Load the services from the input docker-compose.yml file. | |
# TODO: run parallel builds. | |
compose_file = ComposeFile("docker-compose.yml") | |
# Iterate over all services that have a "build" definition. | |
# Tag them, and initiate a push in the background. | |
push_operations = dict() | |
for service_name, service in compose_file.services.items(): | |
if "build" in service: | |
compose_image = "{}_{}".format(project_name, service_name) | |
registry_image = "{}/{}_{}:{}".format(registry, project_name, service_name, version) | |
# Re-tag the image so that it can be uploaded to the registry. | |
subprocess.check_call(["docker", "tag", compose_image, registry_image]) | |
# Spawn "docker push" to upload the image. | |
push_operations[service_name] = subprocess.Popen(["docker", "push", registry_image]) | |
# Replace the "build" definition by an "image" definition, | |
# using the name of the image on the registry. | |
del service["build"] | |
service["image"] = registry_image | |
# Wait for push operations to complete. | |
for service_name, popen_object in push_operations.items(): | |
print("Waiting for {} push to complete...".format(service_name)) | |
popen_object.wait() | |
print("Done.") | |
# Write the new docker-compose.yml file. | |
if "COMPOSE_FILE" not in os.environ: | |
os.environ["COMPOSE_FILE"] = "docker-compose.yml-{}".format(version) | |
print("Writing to new Compose file:") | |
else: | |
print("Writing to provided Compose file:") | |
print("COMPOSE_FILE={}".format(os.environ["COMPOSE_FILE"])) | |
compose_file.save() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment