Merge branch 'ulyssessouza-6245-docker-compose-multiple-push'

This commit is contained in:
Joffrey F 2018-12-04 17:14:12 -08:00
commit c139455fce
2 changed files with 29 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

@ -620,3 +620,23 @@ class ProjectTest(unittest.TestCase):
self.mock_client.pull.side_effect = OperationFailedError(b'pull error') self.mock_client.pull.side_effect = OperationFailedError(b'pull error')
with pytest.raises(ProjectError): with pytest.raises(ProjectError):
project.pull(parallel_pull=True) project.pull(parallel_pull=True)
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 = Service('busy1', **service_config_latest)
svc1_1 = Service('busy11', **service_config_latest)
svc2 = Service('busy2', **service_config_default)
svc2_1 = Service('busy21', **service_config_default)
svc3 = Service('busy3', **service_config_sha)
svc3_1 = Service('busy31', **service_config_sha)
project = Project(
'composetest', [svc1, svc1_1, svc2, svc2_1, svc3, svc3_1], self.mock_client
)
with mock.patch('compose.service.Service.push') as fake_push:
project.push()
assert fake_push.call_count == 2