Merge branch '6245-docker-compose-multiple-push' of https://github.com/ulyssessouza/compose into ulyssessouza-6245-docker-compose-multiple-push

This commit is contained in:
Joffrey F 2018-12-04 17:10:31 -08:00
commit 5b2092688a
2 changed files with 27 additions and 1 deletions

View File

@ -29,6 +29,7 @@ from .service import ContainerNetworkMode
from .service import ContainerPidMode from .service import ContainerPidMode
from .service import ConvergenceStrategy from .service import ConvergenceStrategy
from .service import NetworkMode from .service import NetworkMode
from .service import parse_repository_tag
from .service import PidMode from .service import PidMode
from .service import Service from .service import Service
from .service import ServiceNetworkMode from .service import ServiceNetworkMode
@ -592,8 +593,15 @@ class Project(object):
service.pull(ignore_pull_failures, silent=silent) service.pull(ignore_pull_failures, silent=silent)
def push(self, service_names=None, ignore_push_failures=False): def push(self, service_names=None, ignore_push_failures=False):
unique_images = set()
for service in self.get_services(service_names, include_deps=False): for service in self.get_services(service_names, include_deps=False):
service.push(ignore_push_failures) # Considering <image> and <image:latest> as the same
repo, tag, sep = parse_repository_tag(service.image_name)
service_image_name = sep.join((repo, tag)) if tag else sep.join((repo, 'latest'))
if service_image_name not in unique_images:
service.push(ignore_push_failures)
unique_images.add(service_image_name)
def _labeled_containers(self, stopped=False, one_off=OneOffFilter.exclude): def _labeled_containers(self, stopped=False, one_off=OneOffFilter.exclude):
ctnrs = list(filter(None, [ ctnrs = list(filter(None, [

View File

@ -1995,3 +1995,21 @@ class ProjectTest(DockerClientTestCase):
net_data = self.client.inspect_network(full_net_name) net_data = self.client.inspect_network(full_net_name)
assert net_data assert net_data
assert net_data['Labels'][LABEL_PROJECT] == '-dashtest' assert net_data['Labels'][LABEL_PROJECT] == '-dashtest'
def test_avoid_multiple_push(self):
service_config_latest = {'image': 'busybox:latest', 'build': '.'}
service_config_default = {'image': 'busybox', 'build': '.'}
service_config_sha = {
'image': 'busybox@sha256:38a203e1986cf79639cfb9b2e1d6e773de84002feea2d4eb006b52004ee8502d',
'build': '.'
}
svc1 = self.create_service('busy1', **service_config_latest)
svc1_1 = self.create_service('busy11', **service_config_latest)
svc2 = self.create_service('busy2', **service_config_default)
svc2_1 = self.create_service('busy21', **service_config_default)
svc3 = self.create_service('busy3', **service_config_sha)
svc3_1 = self.create_service('busy31', **service_config_sha)
project = Project('composetest', [svc1, svc1_1, svc2, svc2_1, svc3, svc3_1], self.client)
with mock.patch('compose.service.Service.push') as fake_push:
project.push(ignore_push_failures=True)
assert fake_push.call_count == 2