| 644 | |
| 645 | |
| 646 | class DockerComposeCommand(Command): |
| 647 | add_help = False |
| 648 | allow_unknown_arguments = True |
| 649 | |
| 650 | def __init__( |
| 651 | self, |
| 652 | name: str, |
| 653 | help: str, |
| 654 | help_epilog: str | None = None, |
| 655 | runs_containers: bool = False, |
| 656 | resolve_image_specs: bool = True, |
| 657 | ): |
| 658 | self.name = name |
| 659 | self.help = help |
| 660 | self.help_epilog = help_epilog |
| 661 | self.runs_containers = runs_containers |
| 662 | self.resolve_image_specs = resolve_image_specs |
| 663 | |
| 664 | def configure(self, parser: argparse.ArgumentParser) -> None: |
| 665 | parser.add_argument("-h", "--help", action="store_true") |
| 666 | |
| 667 | def run(self, args: argparse.Namespace) -> None: |
| 668 | if args.help: |
| 669 | output = self.capture( |
| 670 | ["docker", "compose", self.name, "--help"], stderr=subprocess.STDOUT |
| 671 | ) |
| 672 | output = output.replace("docker compose", "./mzcompose") |
| 673 | output += "\nThis command is a wrapper around Docker Compose." |
| 674 | if self.help_epilog: |
| 675 | output += "\n" |
| 676 | output += self.help_epilog |
| 677 | print(output, file=sys.stderr) |
| 678 | return |
| 679 | |
| 680 | composition = load_composition( |
| 681 | args, resolve_image_specs=self.resolve_image_specs |
| 682 | ) |
| 683 | if ( |
| 684 | args.coverage |
| 685 | or not ui.env_is_truthy("CI") |
| 686 | or ui.env_is_truthy("CI_ALLOW_LOCAL_BUILD") |
| 687 | ): |
| 688 | dependencies = list(composition.dependencies) |
| 689 | if dependencies: |
| 690 | ui.section("Collecting mzbuild images") |
| 691 | for d in dependencies: |
| 692 | ui.say(d.spec()) |
| 693 | |
| 694 | if self.runs_containers: |
| 695 | if args.coverage: |
| 696 | # If the user has requested coverage information, create the |
| 697 | # coverage directory as the current user, so Docker doesn't create |
| 698 | # it as root. |
| 699 | (composition.path / "coverage").mkdir(exist_ok=True) |
| 700 | # Need materialize user to be able to write to coverage |
| 701 | os.chmod(composition.path / "coverage", 0o777) |
| 702 | self.check_docker_resource_limits() |
| 703 | composition.dependencies.acquire() |