Jelajahi Sumber

Handle environment file override within TopLevelCommand

Several (but not all) of the subcommands are accepting and processing the
`--env-file` option, but only because they need to look for a specific
value in the environment. The work of applying the override makes more
sense as the domain of TopLevelCommand, and moving it there and removing
the option from the subcommands makes things simpler.

Signed-off-by: Klaas Hoekema <[email protected]>
Klaas Hoekema 6 tahun lalu
induk
melakukan
99464d9c2b
1 mengubah file dengan 10 tambahan dan 16 penghapusan
  1. 10 16
      compose/cli/main.py

+ 10 - 16
compose/cli/main.py

@@ -247,6 +247,11 @@ class TopLevelCommand(object):
     def project_dir(self):
     def project_dir(self):
         return self.toplevel_options.get('--project-directory') or '.'
         return self.toplevel_options.get('--project-directory') or '.'
 
 
+    @property
+    def environment(self):
+        environment_file = self.toplevel_options.get('--env-file')
+        return Environment.from_env_file(self.project_dir, environment_file)
+
     def build(self, options):
     def build(self, options):
         """
         """
         Build or rebuild services.
         Build or rebuild services.
@@ -276,9 +281,7 @@ class TopLevelCommand(object):
                     '--build-arg is only supported when services are specified for API version < 1.25.'
                     '--build-arg is only supported when services are specified for API version < 1.25.'
                     ' Please use a Compose file version > 2.2 or specify which services to build.'
                     ' Please use a Compose file version > 2.2 or specify which services to build.'
                 )
                 )
-            environment_file = options.get('--env-file')
-            environment = Environment.from_env_file(self.project_dir, environment_file)
-            build_args = resolve_build_args(build_args, environment)
+            build_args = resolve_build_args(build_args, self.environment)
 
 
         self.project.build(
         self.project.build(
             service_names=options['SERVICE'],
             service_names=options['SERVICE'],
@@ -429,11 +432,8 @@ class TopLevelCommand(object):
                                     Compose file
                                     Compose file
             -t, --timeout TIMEOUT   Specify a shutdown timeout in seconds.
             -t, --timeout TIMEOUT   Specify a shutdown timeout in seconds.
                                     (default: 10)
                                     (default: 10)
-            --env-file PATH         Specify an alternate environment file
         """
         """
-        environment_file = options.get('--env-file')
-        environment = Environment.from_env_file(self.project_dir, environment_file)
-        ignore_orphans = environment.get_boolean('COMPOSE_IGNORE_ORPHANS')
+        ignore_orphans = self.environment.get_boolean('COMPOSE_IGNORE_ORPHANS')
 
 
         if ignore_orphans and options['--remove-orphans']:
         if ignore_orphans and options['--remove-orphans']:
             raise UserError("COMPOSE_IGNORE_ORPHANS and --remove-orphans cannot be combined.")
             raise UserError("COMPOSE_IGNORE_ORPHANS and --remove-orphans cannot be combined.")
@@ -489,11 +489,8 @@ class TopLevelCommand(object):
             -e, --env KEY=VAL Set environment variables (can be used multiple times,
             -e, --env KEY=VAL Set environment variables (can be used multiple times,
                               not supported in API < 1.25)
                               not supported in API < 1.25)
             -w, --workdir DIR Path to workdir directory for this command.
             -w, --workdir DIR Path to workdir directory for this command.
-            --env-file PATH   Specify an alternate environment file
         """
         """
-        environment_file = options.get('--env-file')
-        environment = Environment.from_env_file(self.project_dir, environment_file)
-        use_cli = not environment.get_boolean('COMPOSE_INTERACTIVE_NO_CLI')
+        use_cli = not self.environment.get_boolean('COMPOSE_INTERACTIVE_NO_CLI')
         index = int(options.get('--index'))
         index = int(options.get('--index'))
         service = self.project.get_service(options['SERVICE'])
         service = self.project.get_service(options['SERVICE'])
         detach = options.get('--detach')
         detach = options.get('--detach')
@@ -1051,7 +1048,6 @@ class TopLevelCommand(object):
                                        container. Implies --abort-on-container-exit.
                                        container. Implies --abort-on-container-exit.
             --scale SERVICE=NUM        Scale SERVICE to NUM instances. Overrides the
             --scale SERVICE=NUM        Scale SERVICE to NUM instances. Overrides the
                                        `scale` setting in the Compose file if present.
                                        `scale` setting in the Compose file if present.
-            --env-file PATH            Specify an alternate environment file
         """
         """
         start_deps = not options['--no-deps']
         start_deps = not options['--no-deps']
         always_recreate_deps = options['--always-recreate-deps']
         always_recreate_deps = options['--always-recreate-deps']
@@ -1066,9 +1062,7 @@ class TopLevelCommand(object):
         if detached and (cascade_stop or exit_value_from):
         if detached and (cascade_stop or exit_value_from):
             raise UserError("--abort-on-container-exit and -d cannot be combined.")
             raise UserError("--abort-on-container-exit and -d cannot be combined.")
 
 
-        environment_file = options.get('--env-file')
-        environment = Environment.from_env_file(self.project_dir, environment_file)
-        ignore_orphans = environment.get_boolean('COMPOSE_IGNORE_ORPHANS')
+        ignore_orphans = self.environment.get_boolean('COMPOSE_IGNORE_ORPHANS')
 
 
         if ignore_orphans and remove_orphans:
         if ignore_orphans and remove_orphans:
             raise UserError("COMPOSE_IGNORE_ORPHANS and --remove-orphans cannot be combined.")
             raise UserError("COMPOSE_IGNORE_ORPHANS and --remove-orphans cannot be combined.")
@@ -1360,7 +1354,7 @@ def run_one_off_container(container_options, project, service, options, toplevel
         if options['--rm']:
         if options['--rm']:
             project.client.remove_container(container.id, force=True, v=True)
             project.client.remove_container(container.id, force=True, v=True)
 
 
-    environment_file = options.get('--env-file')
+    environment_file = toplevel_options.get('--env-file')
     environment = Environment.from_env_file(project_dir, environment_file)
     environment = Environment.from_env_file(project_dir, environment_file)
     use_cli = not environment.get_boolean('COMPOSE_INTERACTIVE_NO_CLI')
     use_cli = not environment.get_boolean('COMPOSE_INTERACTIVE_NO_CLI')
     signals.set_signal_handler_to_shutdown()
     signals.set_signal_handler_to_shutdown()