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 <github@albersweb.de>
This commit is contained in:
Harald Albers 2021-01-22 13:01:53 +00:00
parent 8f2bb66e73
commit 862107a32a
4 changed files with 31 additions and 1 deletions

View File

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

View File

@ -138,7 +138,7 @@ _docker_compose_config() {
;; ;;
esac 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" ) )
} }

View File

@ -237,6 +237,11 @@ class CLITestCase(DockerClientTestCase):
result = self.dispatch(['-H=tcp://doesnotexist:8000', 'ps'], returncode=1) result = self.dispatch(['-H=tcp://doesnotexist:8000', 'ps'], returncode=1)
assert "Couldn't connect to Docker daemon" in result.stderr 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): def test_config_list_services(self):
self.base_dir = 'tests/fixtures/v2-full' self.base_dir = 'tests/fixtures/v2-full'
result = self.dispatch(['config', '--services']) result = self.dispatch(['config', '--services'])

View File

@ -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