Browse Source

Add option for listing service profiles

For command completion of `docker-compose --profile`, we need a portable
way to get a list of profiles used in the current config.

This commit adds a new option `docker-compose config --profiles`.

Signed-off-by: Harald Albers <[email protected]>
Harald Albers 4 years ago
parent
commit
862107a32a

+ 10 - 0
compose/cli/main.py

@@ -381,6 +381,7 @@ class TopLevelCommand:
             --no-interpolate         Don't interpolate environment variables.
             -q, --quiet              Only validate the configuration, don't print
                                      anything.
+            --profiles               Print the profile names, one per line.
             --services               Print the service names, one per line.
             --volumes                Print the volume names, one per line.
             --hash="*"               Print the service config hash, one per line.
@@ -400,6 +401,15 @@ class TopLevelCommand:
         if options['--quiet']:
             return
 
+        if options['--profiles']:
+            profiles = set()
+            for service in compose_config.services:
+                if 'profiles' in service:
+                    for profile in service['profiles']:
+                        profiles.add(profile)
+            print('\n'.join(sorted(profiles)))
+            return
+
         if options['--services']:
             print('\n'.join(service['name'] for service in compose_config.services))
             return

+ 1 - 1
contrib/completion/bash/docker-compose

@@ -138,7 +138,7 @@ _docker_compose_config() {
 			;;
 	esac
 
-	COMPREPLY=( $( compgen -W "--hash --help --no-interpolate --quiet -q --resolve-image-digests --services --volumes" -- "$cur" ) )
+	COMPREPLY=( $( compgen -W "--hash --help --no-interpolate --profiles --quiet -q --resolve-image-digests --services --volumes" -- "$cur" ) )
 }
 
 

+ 5 - 0
tests/acceptance/cli_test.py

@@ -237,6 +237,11 @@ class CLITestCase(DockerClientTestCase):
         result = self.dispatch(['-H=tcp://doesnotexist:8000', 'ps'], returncode=1)
         assert "Couldn't connect to Docker daemon" in result.stderr
 
+    def test_config_list_profiles(self):
+        self.base_dir = 'tests/fixtures/config-profiles'
+        result = self.dispatch(['config', '--profiles'])
+        assert set(result.stdout.rstrip().split('\n')) == {'debug', 'frontend', 'gui'}
+
     def test_config_list_services(self):
         self.base_dir = 'tests/fixtures/v2-full'
         result = self.dispatch(['config', '--services'])

+ 15 - 0
tests/fixtures/config-profiles/docker-compose.yml

@@ -0,0 +1,15 @@
+version: '3.8'
+services:
+  frontend:
+    image: frontend
+    profiles: ["frontend", "gui"]
+  phpmyadmin:
+    image: phpmyadmin
+    depends_on:
+      - db
+    profiles:
+      - debug
+  backend:
+    image: backend
+  db:
+    image: mysql