From 2ba02ef80ad906a4c0f87084b0c5e44791599855 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 5 Oct 2023 17:55:18 +0200 Subject: [PATCH 1/3] feat: Ignore FROM args while pre pulling images --- src/Testcontainers/Images/DockerfileArchive.cs | 8 +++----- .../Assets/pullBaseImages/Dockerfile | 1 + .../Unit/Images/ImageFromDockerfileTest.cs | 10 +++++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Testcontainers/Images/DockerfileArchive.cs b/src/Testcontainers/Images/DockerfileArchive.cs index 4eda0f8bc..afac14a37 100644 --- a/src/Testcontainers/Images/DockerfileArchive.cs +++ b/src/Testcontainers/Images/DockerfileArchive.cs @@ -89,10 +89,6 @@ public IEnumerable GetBaseImages() .Where(line => !line.StartsWith("#", StringComparison.Ordinal)) .Select(line => FromLinePattern.Match(line)) .Where(match => match.Success) - // Until now, we are unable to resolve variables within Dockerfiles. Ignore base - // images that utilize variables. Expect them to exist on the host. - .Where(match => !match.Groups[imageGroup].Value.Contains('$')) - .Where(match => !match.Groups[imageGroup].Value.Any(char.IsUpper)) .ToArray(); var stages = lines @@ -105,7 +101,9 @@ public IEnumerable GetBaseImages() var images = lines .Select(match => match.Groups[imageGroup]) - .Select(group => group.Value) + .Select(match => match.Value) + .Where(line => !line.Contains('$')) + .Where(line => !line.Any(char.IsUpper)) .Where(value => !stages.Contains(value)) .Distinct() .Select(value => new DockerImage(value)) diff --git a/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile b/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile index 05d7b2c45..dcce54943 100644 --- a/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile +++ b/tests/Testcontainers.Tests/Assets/pullBaseImages/Dockerfile @@ -6,3 +6,4 @@ FROM mcr.microsoft.com/dotnet/runtime:6.0 AS runtime FROM build FROM build AS publish FROM mcr.microsoft.com/dotnet/aspnet:6.0.21-jammy-amd64 +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/aspnet:6.0.22-jammy-amd64 diff --git a/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs b/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs index 3803cd16b..c44d20ea6 100644 --- a/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs +++ b/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs @@ -21,13 +21,17 @@ public void DockerfileArchiveGetBaseImages() // Given IImage image = new DockerImage("localhost/testcontainers", Guid.NewGuid().ToString("D"), string.Empty); - var dockerfileArchive = new DockerfileArchive("Assets//pullBaseImages/", "Dockerfile", image, NullLogger.Instance); + var dockerfileArchive = new DockerfileArchive("Assets/pullBaseImages/", "Dockerfile", image, NullLogger.Instance); // When - var baseImages = dockerfileArchive.GetBaseImages(); + var baseImages = dockerfileArchive.GetBaseImages().ToArray(); // Then - Assert.Equal(3, baseImages.Count()); + Assert.Equal(4, baseImages.Length); + Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/sdk:6.0".Equals(item.FullName)); + Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/runtime:6.0".Equals(item.FullName)); + Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/aspnet:6.0.21-jammy-amd64".Equals(item.FullName)); + Assert.Contains(baseImages, item => "mcr.microsoft.com/dotnet/aspnet:6.0.22-jammy-amd64".Equals(item.FullName)); } [Fact] From d8b21ea7c6c9cc5a9489d33f51c6df41d0faf1d3 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 5 Oct 2023 19:28:10 +0200 Subject: [PATCH 2/3] docs: Add module example docs to MkDocs config --- docs/modules/elasticsearch.md | 16 ++++++---------- docs/modules/mongodb.md | 13 ++++++------- .../{microsoft-sql-server.md => mssql.md} | 17 ++++++++--------- docs/modules/neo4j.md | 13 ++++++------- mkdocs.yml | 4 ++++ .../Neo4jContainerTest.cs | 2 +- 6 files changed, 31 insertions(+), 34 deletions(-) rename docs/modules/{microsoft-sql-server.md => mssql.md} (80%) diff --git a/docs/modules/elasticsearch.md b/docs/modules/elasticsearch.md index 00fa7ebe2..156eb76d2 100644 --- a/docs/modules/elasticsearch.md +++ b/docs/modules/elasticsearch.md @@ -20,19 +20,15 @@ using Elastic.Transport; using Testcontainers.Elasticsearch; using Xunit; -namespace TestcontainersModules; - -public class ElasticsearchContainerTest : IAsyncLifetime +public sealed class ElasticsearchContainerTest : IAsyncLifetime { - private readonly ElasticsearchContainer elasticsearch - = new ElasticsearchBuilder() - .Build(); + private readonly ElasticsearchContainer _elasticsearch + = new ElasticsearchBuilder().Build(); [Fact] public async Task ReadFromElasticsearch() { - var connectionString = elasticsearch.GetConnectionString(); - var settings = new ElasticsearchClientSettings(new Uri(connectionString)); + var settings = new ElasticsearchClientSettings(new Uri(_elasticsearch.GetConnectionString())); settings.ServerCertificateValidationCallback(CertificateValidations.AllowAll); var client = new ElasticsearchClient(settings); @@ -43,10 +39,10 @@ public class ElasticsearchContainerTest : IAsyncLifetime } public Task InitializeAsync() - => elasticsearch.StartAsync(); + => _elasticsearch.StartAsync(); public Task DisposeAsync() - => elasticsearch.DisposeAsync().AsTask(); + => _elasticsearch.DisposeAsync().AsTask(); } ``` diff --git a/docs/modules/mongodb.md b/docs/modules/mongodb.md index 46408e7ec..43cb06fcf 100644 --- a/docs/modules/mongodb.md +++ b/docs/modules/mongodb.md @@ -21,16 +21,15 @@ using Xunit; namespace TestcontainersModules; -public class MongoDbContainerTest : IAsyncLifetime +public sealed class MongoDbContainerTest : IAsyncLifetime { - private readonly MongoDbContainer mongoDbContainer = - new MongoDbBuilder() - .Build(); + private readonly MongoDbContainer _mongoDbContainer = + new MongoDbBuilder().Build(); [Fact] public async Task ReadFromMongoDbDatabase() { - var client = new MongoClient(mongoDbContainer.GetConnectionString()); + var client = new MongoClient(_mongoDbContainer.GetConnectionString()); using var databases = await client.ListDatabasesAsync(); @@ -38,10 +37,10 @@ public class MongoDbContainerTest : IAsyncLifetime } public Task InitializeAsync() - => mongoDbContainer.StartAsync(); + => _mongoDbContainer.StartAsync(); public Task DisposeAsync() - => mongoDbContainer.DisposeAsync().AsTask(); + => _mongoDbContainer.DisposeAsync().AsTask(); } ``` diff --git a/docs/modules/microsoft-sql-server.md b/docs/modules/mssql.md similarity index 80% rename from docs/modules/microsoft-sql-server.md rename to docs/modules/mssql.md index d417d0684..63ff6c70d 100644 --- a/docs/modules/microsoft-sql-server.md +++ b/docs/modules/mssql.md @@ -21,30 +21,29 @@ using Xunit; namespace TestcontainersModules; -public class MsSqlServerContainerTest : IAsyncLifetime +public sealed class MsSqlServerContainerTest : IAsyncLifetime { - private readonly MsSqlContainer msSqlContainer - = new MsSqlBuilder() - .Build(); + private readonly MsSqlContainer _msSqlContainer + = new MsSqlBuilder().Build(); [Fact] public async Task ReadFromMsSqlDatabase() { - await using var connection = new SqlConnection(msSqlContainer.GetConnectionString()); + await using var connection = new SqlConnection(_msSqlContainer.GetConnectionString()); await connection.OpenAsync(); await using var command = connection.CreateCommand(); - command.CommandText = "Select 1;"; + command.CommandText = "SELECT 1;"; var actual = await command.ExecuteScalarAsync() as int?; - Assert.Equal(expected: 1, actual: actual.GetValueOrDefault()); + Assert.Equal(1, actual.GetValueOrDefault()); } public Task InitializeAsync() - => msSqlContainer.StartAsync(); + => _msSqlContainer.StartAsync(); public Task DisposeAsync() - => msSqlContainer.DisposeAsync().AsTask(); + => _msSqlContainer.DisposeAsync().AsTask(); } ``` diff --git a/docs/modules/neo4j.md b/docs/modules/neo4j.md index 44a5cec0b..991bbc7f0 100644 --- a/docs/modules/neo4j.md +++ b/docs/modules/neo4j.md @@ -21,18 +21,17 @@ using Xunit; namespace TestcontainersModules; -public class Neo4jContainerTest : IAsyncLifetime +public sealed class Neo4jContainerTest : IAsyncLifetime { - private readonly Neo4jContainer neo4jContainer - = new Neo4jBuilder() - .Build(); + private readonly Neo4jContainer _neo4jContainer + = new Neo4jBuilder().Build(); [Fact] public async Task CanReadNeo4jDatabase() { const string database = "neo4j"; - await using var client = GraphDatabase.Driver(neo4jContainer.GetConnectionString()); + await using var client = GraphDatabase.Driver(_neo4jContainer.GetConnectionString()); await using var session = client.AsyncSession(cfg => cfg.WithDatabase(database)); @@ -40,10 +39,10 @@ public class Neo4jContainerTest : IAsyncLifetime } public Task InitializeAsync() - => neo4jContainer.StartAsync(); + => _neo4jContainer.StartAsync(); public Task DisposeAsync() - => neo4jContainer.DisposeAsync().AsTask(); + => _neo4jContainer.DisposeAsync().AsTask(); } ``` diff --git a/mkdocs.yml b/mkdocs.yml index 78f930aa6..aef94ee8e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -39,5 +39,9 @@ nav: - examples/aspnet.md - Modules: - modules/index.md + - modules/elasticsearch.md + - modules/mongodb.md + - modules/mssql.md + - modules/neo4j.md - modules/postgres.md - modules/rabbitmq.md diff --git a/tests/Testcontainers.Neo4j.Tests/Neo4jContainerTest.cs b/tests/Testcontainers.Neo4j.Tests/Neo4jContainerTest.cs index 6d2ca9cb4..0e08ff3e3 100644 --- a/tests/Testcontainers.Neo4j.Tests/Neo4jContainerTest.cs +++ b/tests/Testcontainers.Neo4j.Tests/Neo4jContainerTest.cs @@ -24,7 +24,7 @@ public void SessionReturnsDatabase() using var driver = GraphDatabase.Driver(_neo4jContainer.GetConnectionString()); // When - using var session = driver.AsyncSession(sessionConfigBuilder => sessionConfigBuilder.WithDatabase("neo4j")); + using var session = driver.AsyncSession(sessionConfigBuilder => sessionConfigBuilder.WithDatabase(database)); // Then Assert.Equal(database, session.SessionConfig.Database); From b4f26896239bc59965e7764c50f26084ffa8d8a4 Mon Sep 17 00:00:00 2001 From: Andre Hofmeister <9199345+HofmeisterAn@users.noreply.github.com> Date: Thu, 5 Oct 2023 20:07:51 +0200 Subject: [PATCH 3/3] chore: Keep comment that we do not resolve ARGs yet --- src/Testcontainers/Images/DockerfileArchive.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Testcontainers/Images/DockerfileArchive.cs b/src/Testcontainers/Images/DockerfileArchive.cs index afac14a37..c752ca050 100644 --- a/src/Testcontainers/Images/DockerfileArchive.cs +++ b/src/Testcontainers/Images/DockerfileArchive.cs @@ -102,6 +102,8 @@ public IEnumerable GetBaseImages() var images = lines .Select(match => match.Groups[imageGroup]) .Select(match => match.Value) + // Until now, we are unable to resolve variables within Dockerfiles. Ignore base + // images that utilize variables. Expect them to exist on the host. .Where(line => !line.Contains('$')) .Where(line => !line.Any(char.IsUpper)) .Where(value => !stages.Contains(value))