/// <summary> /// Starts the resource reaper if it is enabled /// </summary> /// <param name="dockerClient">Docker client to use</param> /// <param name="loggerFactory">Optional loggerFactory to log progress</param> /// <returns>Task that completes when reaper starts successfully</returns> public static async Task StartAsync(IDockerClient dockerClient, ILoggerFactory loggerFactory = null) { var logger = loggerFactory?.CreateLogger(typeof(ResourceReaper)); var disabled = Environment.GetEnvironmentVariable("REAPER_DISABLED"); if (!string.IsNullOrWhiteSpace(disabled) && (disabled.Equals("1") || disabled.ToLower().Equals("true"))) { logger?.LogInformation("Reaper is disabled via $REAPER_DISABLED environment variable"); return; } var ryukImage = Environment.GetEnvironmentVariable("REAPER_IMAGE"); if (string.IsNullOrWhiteSpace(ryukImage)) { ryukImage = DefaultRyukImage; } if (_ryukStartupTaskCompletionSource == null) { await InitLock.WaitAsync(); try { if (_ryukStartupTaskCompletionSource == null) { logger?.LogDebug("Starting ryuk container ..."); _ryukStartupTaskCompletionSource = new TaskCompletionSource <bool>(); _ryukContainer = new RyukContainer(ryukImage, dockerClient, loggerFactory ?? NullLoggerFactory.Instance); await _ryukContainer.StartAsync(); _ryukContainer.AddToDeathNote(new LabelsFilter(Labels)); _ryukStartupTaskCompletionSource.SetResult(true); logger?.LogDebug("Ryuk container started"); } else { logger?.LogDebug("Reaper is already started"); } } finally { InitLock.Release(); } } else { logger?.LogDebug("Reaper is already started"); } SetupShutdownHook(dockerClient); await _ryukStartupTaskCompletionSource.Task; }
/// <summary> /// Starts the resource reaper if it is enabled /// </summary> /// <param name="dockerClient">Docker client to use</param> /// <returns>Task that completes when reaper starts successfully</returns> public static async Task StartAsync(IDockerClient dockerClient) { var disabled = Environment.GetEnvironmentVariable("REAPER_DISABLED"); if (!string.IsNullOrWhiteSpace(disabled) && (disabled.Equals("1") || disabled.ToLower().Equals("true"))) { return; } // todo: Remove this when ryuk for windows is complete var platformSpecificFactory = new PlatformSpecificFactory(); if (platformSpecificFactory.IsWindows()) { // don't start resource reaper for windows // because ryuk for windows is not developed yet return; } if (_ryukStartupTaskCompletionSource == null) { await InitLock.WaitAsync(); try { if (_ryukStartupTaskCompletionSource == null) { _ryukStartupTaskCompletionSource = new TaskCompletionSource <bool>(); _ryukContainer = new RyukContainer(dockerClient, platformSpecificFactory.Create(), NullLoggerFactory.Instance); var ryukStartupTask = _ryukContainer.StartAsync(); await ryukStartupTask.ContinueWith(_ => { _ryukContainer.AddToDeathNote(new LabelsFilter(Labels)); _ryukStartupTaskCompletionSource.SetResult(true); }); } } finally { InitLock.Release(); } } await _ryukStartupTaskCompletionSource.Task; }