diff --git a/compose/config/config.py b/compose/config/config.py
index b8bffc660..fdb20df19 100644
--- a/compose/config/config.py
+++ b/compose/config/config.py
@@ -959,7 +959,7 @@ def merge_ports(md, base, override):
 
     merged = parse_sequence_func(md.base.get(field, []))
     merged.update(parse_sequence_func(md.override.get(field, [])))
-    md[field] = [item for item in sorted(merged.values())]
+    md[field] = [item for item in sorted(merged.values(), key=lambda x: x.target)]
 
 
 def merge_build(output, base, override):
diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py
index 87bdd8bca..6178447ae 100644
--- a/tests/unit/config/config_test.py
+++ b/tests/unit/config/config_test.py
@@ -1615,6 +1615,22 @@ class ConfigTest(unittest.TestCase):
             'ports': types.ServicePort.parse('5432')
         }
 
+    def test_merge_service_dicts_ports_sorting(self):
+        base = {
+            'ports': [5432]
+        }
+        override = {
+            'image': 'alpine:edge',
+            'ports': ['5432/udp']
+        }
+        actual = config.merge_service_dicts_from_files(
+            base,
+            override,
+            DEFAULT_VERSION)
+        assert len(actual['ports']) == 2
+        assert types.ServicePort.parse('5432')[0] in actual['ports']
+        assert types.ServicePort.parse('5432/udp')[0] in actual['ports']
+
     def test_merge_service_dicts_heterogeneous_volumes(self):
         base = {
             'volumes': ['/a:/b', '/x:/z'],