public static Task Wait(WaitForDockerConfig config)
        {
            config = config ?? new WaitForDockerConfig();
            var composeYaml  = DockerFilesReader.ReadComposeContent(config.DockerComposeDirPath, config.ComposeFileName);
            var composeJson  = new JsonComposeConverter().Convert(composeYaml);
            var servicePorts = new JsonComposeServicesPortsExtractor().ExtractServicePorts(composeJson).ToArray();

            var killCommand = DockerCommandBuilder.BuildDockerKillCommand(config, servicePorts);

            ShellExecutorFactory.GetShellExecutor(config.Logger).Execute(killCommand, DockerConsts.DockerComposeKill);
            return(Task.CompletedTask);
        }
        public static async Task Wait(WaitForDockerConfig config)
        {
            config = config ?? new WaitForDockerConfig();
            var logger = config.Logger;

            logger.Log("Wait for docker has been started..");
            var composeYaml  = DockerFilesReader.ReadComposeContent(config.DockerComposeDirPath, config.ComposeFileName);
            var composeJson  = new JsonComposeConverter().Convert(composeYaml);
            var servicePorts = new JsonComposeServicesPortsExtractor().ExtractServicePorts(composeJson).ToArray();

            logger.Log($"Checking is any port is already occupied before {DockerConsts.DockerCompose} execution..");
            await DockerHealthCheckRunner.RunPreComposeHealthChecks(servicePorts, config.Logger);

            config.ExtendWithDefaultHealthChecks(servicePorts);
            var composeCommand = DockerCommandBuilder.BuildComposeCommand(config);

            ShellExecutorFactory.GetShellExecutor(config.Logger).Execute(composeCommand, DockerConsts.DockerCompose);

            await DockerHealthCheckRunner.RunPostComposeHealthChecks(config.HealthCheckers);

            logger.Log("All health checks returns success.");
            logger.Log("Wait for docker has been finished..");
        }