-
-
Notifications
You must be signed in to change notification settings - Fork 250
/
ImageFromDockerfileBuilder.cs
137 lines (120 loc) · 5.47 KB
/
ImageFromDockerfileBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
namespace DotNet.Testcontainers.Builders
{
using System;
using System.Collections.Generic;
using System.IO;
using Docker.DotNet.Models;
using DotNet.Testcontainers.Configurations;
using DotNet.Testcontainers.Images;
using JetBrains.Annotations;
/// <summary>
/// A fluent Docker image builder.
/// </summary>
/// <example>
/// The default configuration is equivalent to:
/// <code>
/// _ = new ImageFromDockerfileBuilder()
/// .WithDockerEndpoint(TestcontainersSettings.OS.DockerEndpointAuthConfig)
/// .WithLabel(DefaultLabels.Instance)
/// .WithCleanUp(true)
/// .WithDockerfile("Dockerfile")
/// .WithDockerfileDirectory(Directory.GetCurrentDirectory())
/// .WithName(new DockerImage("localhost/testcontainers", Guid.NewGuid().ToString("D"), string.Empty))
/// .Build();
/// </code>
/// </example>
[PublicAPI]
public class ImageFromDockerfileBuilder : AbstractBuilder<ImageFromDockerfileBuilder, IFutureDockerImage, ImageBuildParameters, IImageFromDockerfileConfiguration>, IImageFromDockerfileBuilder<ImageFromDockerfileBuilder>
{
/// <summary>
/// Initializes a new instance of the <see cref="ImageFromDockerfileBuilder" /> class.
/// </summary>
public ImageFromDockerfileBuilder()
: this(new ImageFromDockerfileConfiguration())
{
DockerResourceConfiguration = Init().DockerResourceConfiguration;
}
/// <summary>
/// Initializes a new instance of the <see cref="ImageFromDockerfileBuilder" /> class.
/// </summary>
/// <param name="dockerResourceConfiguration">The Docker resource configuration.</param>
private ImageFromDockerfileBuilder(IImageFromDockerfileConfiguration dockerResourceConfiguration)
: base(dockerResourceConfiguration)
{
DockerResourceConfiguration = dockerResourceConfiguration;
}
/// <inheritdoc />
protected override IImageFromDockerfileConfiguration DockerResourceConfiguration { get; }
/// <inheritdoc />
public ImageFromDockerfileBuilder WithName(string name)
{
return WithName(new DockerImage(name));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithName(IImage name)
{
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(image: name));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithDockerfile(string dockerfile)
{
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(dockerfile: dockerfile));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithDockerfileDirectory(string dockerfileDirectory)
{
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(dockerfileDirectory: dockerfileDirectory));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithDockerfileDirectory(CommonDirectoryPath commonDirectoryPath, string dockerfileDirectory)
{
var dockerfileDirectoryPath = Path.Combine(commonDirectoryPath.DirectoryPath, dockerfileDirectory);
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(dockerfileDirectory: dockerfileDirectoryPath));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithImageBuildPolicy(Func<ImageInspectResponse, bool> imageBuildPolicy)
{
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(imageBuildPolicy: imageBuildPolicy));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithDeleteIfExists(bool deleteIfExists)
{
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(deleteIfExists: deleteIfExists));
}
/// <inheritdoc />
public ImageFromDockerfileBuilder WithBuildArgument(string name, string value)
{
var buildArguments = new Dictionary<string, string> { { name, value } };
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(buildArguments: buildArguments));
}
/// <inheritdoc />
public override IFutureDockerImage Build()
{
Validate();
return new FutureDockerImage(DockerResourceConfiguration);
}
/// <inheritdoc />
protected sealed override ImageFromDockerfileBuilder Init()
{
return base.Init().WithImageBuildPolicy(PullPolicy.Always).WithDockerfile("Dockerfile").WithDockerfileDirectory(Directory.GetCurrentDirectory()).WithName(new DockerImage("localhost/testcontainers", Guid.NewGuid().ToString("D"), string.Empty));
}
/// <inheritdoc />
protected override void Validate()
{
base.Validate();
const string reuseNotSupported = "Building an image does not support the reuse feature. To keep the built image, disable the cleanup.";
_ = Guard.Argument(DockerResourceConfiguration, nameof(IImageFromDockerfileConfiguration.Reuse))
.ThrowIf(argument => argument.Value.Reuse.HasValue && argument.Value.Reuse.Value, argument => new ArgumentException(reuseNotSupported, argument.Name));
}
/// <inheritdoc />
protected override ImageFromDockerfileBuilder Clone(IResourceConfiguration<ImageBuildParameters> resourceConfiguration)
{
return Merge(DockerResourceConfiguration, new ImageFromDockerfileConfiguration(resourceConfiguration));
}
/// <inheritdoc />
protected override ImageFromDockerfileBuilder Merge(IImageFromDockerfileConfiguration oldValue, IImageFromDockerfileConfiguration newValue)
{
return new ImageFromDockerfileBuilder(new ImageFromDockerfileConfiguration(oldValue, newValue));
}
}
}