command.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. import os
  5. import re
  6. import six
  7. from . import verbose_proxy
  8. from .. import config
  9. from ..const import API_VERSIONS
  10. from ..project import Project
  11. from .docker_client import docker_client
  12. from .utils import get_version_info
  13. log = logging.getLogger(__name__)
  14. def project_from_options(project_dir, options):
  15. return get_project(
  16. project_dir,
  17. get_config_path_from_options(options),
  18. project_name=options.get('--project-name'),
  19. verbose=options.get('--verbose'),
  20. )
  21. def get_config_path_from_options(options):
  22. file_option = options.get('--file')
  23. if file_option:
  24. return file_option
  25. config_files = os.environ.get('COMPOSE_FILE')
  26. if config_files:
  27. return config_files.split(os.pathsep)
  28. return None
  29. def get_client(verbose=False, version=None):
  30. client = docker_client(version=version)
  31. if verbose:
  32. version_info = six.iteritems(client.version())
  33. log.info(get_version_info('full'))
  34. log.info("Docker base_url: %s", client.base_url)
  35. log.info("Docker version: %s",
  36. ", ".join("%s=%s" % item for item in version_info))
  37. return verbose_proxy.VerboseProxy('docker', client)
  38. return client
  39. def get_project(project_dir, config_path=None, project_name=None, verbose=False):
  40. config_details = config.find(project_dir, config_path)
  41. project_name = get_project_name(config_details.working_dir, project_name)
  42. config_data = config.load(config_details)
  43. api_version = os.environ.get(
  44. 'COMPOSE_API_VERSION',
  45. API_VERSIONS[config_data.version])
  46. client = get_client(verbose=verbose, version=api_version)
  47. return Project.from_config(project_name, config_data, client)
  48. def get_project_name(working_dir, project_name=None):
  49. def normalize_name(name):
  50. return re.sub(r'[^a-z0-9]', '', name.lower())
  51. project_name = project_name or os.environ.get('COMPOSE_PROJECT_NAME')
  52. if project_name:
  53. return normalize_name(project_name)
  54. project = os.path.basename(os.path.abspath(working_dir))
  55. if project:
  56. return normalize_name(project)
  57. return 'default'