private static void ConfigureBuilderWithContainerConfiguration( Image.Builder imageBuilder, ContainerConfigurationTemplate containerConfigurationTemplate) { foreach (HistoryEntry i in containerConfigurationTemplate.History) { imageBuilder.AddHistory(i); } if (containerConfigurationTemplate.Created != null) { try { imageBuilder.SetCreated( Instant.FromDateTimeOffset( DateTimeOffset.Parse( containerConfigurationTemplate.Created, CultureInfo.InvariantCulture))); } catch (FormatException ex) { throw new BadContainerConfigurationFormatException( "Invalid image creation time: " + containerConfigurationTemplate.Created, ex); } } if (containerConfigurationTemplate.Architecture != null) { imageBuilder.SetArchitecture(containerConfigurationTemplate.Architecture); } if (containerConfigurationTemplate.Os != null) { imageBuilder.SetOs(containerConfigurationTemplate.Os); } imageBuilder.SetEntrypoint(containerConfigurationTemplate.GetContainerEntrypoint()); imageBuilder.SetProgramArguments(containerConfigurationTemplate.GetContainerCmd()); IList <string> baseHealthCheckCommand = containerConfigurationTemplate.GetContainerHealthTest(); if (baseHealthCheckCommand != null) { DockerHealthCheck.Builder builder = DockerHealthCheck.FromCommand(baseHealthCheckCommand); if (containerConfigurationTemplate.GetContainerHealthInterval() != null) { builder.SetInterval( Duration.FromNanoseconds(containerConfigurationTemplate.GetContainerHealthInterval().GetValueOrDefault())); } if (containerConfigurationTemplate.GetContainerHealthTimeout() != null) { builder.SetTimeout( Duration.FromNanoseconds(containerConfigurationTemplate.GetContainerHealthTimeout().GetValueOrDefault())); } if (containerConfigurationTemplate.GetContainerHealthStartPeriod() != null) { builder.SetStartPeriod( Duration.FromNanoseconds(containerConfigurationTemplate.GetContainerHealthStartPeriod().GetValueOrDefault())); } if (containerConfigurationTemplate.GetContainerHealthRetries() != null) { builder.SetRetries(containerConfigurationTemplate.GetContainerHealthRetries().GetValueOrDefault()); } imageBuilder.SetHealthCheck(builder.Build()); } if (containerConfigurationTemplate.GetContainerExposedPorts() != null) { imageBuilder.AddExposedPorts( PortMapToSet(containerConfigurationTemplate.GetContainerExposedPorts())); } if (containerConfigurationTemplate.GetContainerVolumes() != null) { imageBuilder.AddVolumes(VolumeMapToSet(containerConfigurationTemplate.GetContainerVolumes())); } if (containerConfigurationTemplate.GetContainerEnvironment() != null) { foreach (string environmentVariable in containerConfigurationTemplate.GetContainerEnvironment()) { Match matcher = EnvironmentPattern.Match(environmentVariable); if (!matcher.Success) { throw new BadContainerConfigurationFormatException( "Invalid environment variable definition: " + environmentVariable); } imageBuilder.AddEnvironmentVariable(matcher.Groups["name"].Value, matcher.Groups["value"].Value); } } imageBuilder.AddLabels(containerConfigurationTemplate.GetContainerLabels()); imageBuilder.SetWorkingDirectory(containerConfigurationTemplate.GetContainerWorkingDir()); imageBuilder.SetUser(containerConfigurationTemplate.GetContainerUser()); }
public async Task <Image> CallAsync() { BaseImageWithAuthorization baseImageWithAuthorization = await pullBaseImageStep.GetFuture().ConfigureAwait(false); IReadOnlyList <ICachedLayer> baseImageLayers = await pullAndCacheBaseImageLayersStep.GetFuture().ConfigureAwait(false); IReadOnlyList <ICachedLayer> applicationLayers = await buildAndCacheApplicationLayersStep.GetFuture().ConfigureAwait(false); using (progressEventDispatcherFactory.Create("building image format", 1)) using (new TimerEventDispatcher(buildConfiguration.GetEventHandlers(), DESCRIPTION)) { // Constructs the image. Image.Builder imageBuilder = Image.CreateBuilder(buildConfiguration.GetTargetFormat()); Image baseImage = baseImageWithAuthorization.GetBaseImage(); IContainerConfiguration containerConfiguration = buildConfiguration.GetContainerConfiguration(); // Base image layers foreach (ICachedLayer pullAndCacheBaseImageLayer in baseImageLayers) { imageBuilder.AddLayer(pullAndCacheBaseImageLayer); } // Passthrough config and count non-empty history entries int nonEmptyLayerCount = 0; foreach (HistoryEntry historyObject in baseImage.GetHistory()) { imageBuilder.AddHistory(historyObject); if (!historyObject.HasCorrespondingLayer()) { nonEmptyLayerCount++; } } imageBuilder .SetArchitecture(baseImage.GetArchitecture()) .SetOs(baseImage.GetOs()) .AddEnvironment(baseImage.GetEnvironment()) .AddLabels(baseImage.GetLabels()) .SetHealthCheck(baseImage.GetHealthCheck()) .AddExposedPorts(baseImage.GetExposedPorts()) .AddVolumes(baseImage.GetVolumes()) .SetWorkingDirectory(baseImage.GetWorkingDirectory()); // Add history elements for non-empty layers that don't have one yet Instant layerCreationTime = containerConfiguration == null ? ContainerConfiguration.DefaultCreationTime : containerConfiguration.GetCreationTime(); for (int count = 0; count < baseImageLayers.Count - nonEmptyLayerCount; count++) { imageBuilder.AddHistory( HistoryEntry.CreateBuilder() .SetCreationTimestamp(layerCreationTime) .SetComment("auto-generated by Fib") .Build()); } // Add built layers/configuration foreach (ICachedLayer applicationLayer in applicationLayers) { HistoryEntry.Builder historyBuilder = HistoryEntry.CreateBuilder(); if (buildConfiguration.GetToolName() != null) { historyBuilder.SetCreatedBy(buildConfiguration.GetToolName() + ":" + (buildConfiguration.GetToolVersion() ?? "null")); } else { historyBuilder.SetCreatedBy(ProjectInfo.TOOL_NAME + ":" + ProjectInfo.VERSION); } imageBuilder .AddLayer(applicationLayer) .AddHistory( historyBuilder .SetCreationTimestamp(layerCreationTime) .SetAuthor("Fib") .SetComment(applicationLayer.GetLayerType()) .Build()); } if (containerConfiguration != null) { imageBuilder .AddEnvironment(containerConfiguration.GetEnvironmentMap()) .SetCreated(containerConfiguration.GetCreationTime()) .SetUser(containerConfiguration.GetUser()) .SetEntrypoint(ComputeEntrypoint(baseImage, containerConfiguration)) .SetProgramArguments(ComputeProgramArguments(baseImage, containerConfiguration)) .AddExposedPorts(containerConfiguration.GetExposedPorts()) .AddVolumes(containerConfiguration.GetVolumes()) .AddLabels(containerConfiguration.GetLabels()); if (containerConfiguration.GetWorkingDirectory() != null) { imageBuilder.SetWorkingDirectory(containerConfiguration.GetWorkingDirectory().ToString()); } } // Gets the container configuration content descriptor. return(imageBuilder.Build()); } }