mirror of
https://github.com/jpetazzo/container.training.git
synced 2026-03-04 18:30:38 +00:00
64 lines
2.3 KiB
Python
Executable File
64 lines
2.3 KiB
Python
Executable File
#!/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("."))
|
|
|
|
# Version used to tag the generated Docker image, using the UNIX timestamp or the given version.
|
|
if "VERSION" not in os.environ:
|
|
version = str(int(time.time()))
|
|
else:
|
|
version = os.environ["VERSION"]
|
|
|
|
# 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, compose_image, 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()
|
|
|