diff --git a/Directory.Build.props b/Directory.Build.props index 8eba195b4..0f5eef34a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ $(AssemblyName) - 4.8.0 + 4.8.1 $(Version) $(Version) Testcontainers diff --git a/src/Testcontainers/Images/DockerfileArchive.cs b/src/Testcontainers/Images/DockerfileArchive.cs index 5cbffed8c..e2f1e1e23 100644 --- a/src/Testcontainers/Images/DockerfileArchive.cs +++ b/src/Testcontainers/Images/DockerfileArchive.cs @@ -213,7 +213,15 @@ await AddAsync(absoluteFilePath, relativeFilePath, tarOutputStream) .ConfigureAwait(false); } - await AddAsync(_dockerfile.FullName, _dockerfile.Name, tarOutputStream) + var dockerfileDirectoryLength = _dockerfileDirectory.FullName + .TrimEnd(Path.DirectorySeparatorChar).Length + 1; + + var dockerfileRelativeFilePath = _dockerfile.FullName + .Substring(dockerfileDirectoryLength ); + + var dockerfileNormalizedRelativeFilePath = Unix.Instance.NormalizePath(dockerfileRelativeFilePath); + + await AddAsync(_dockerfile.FullName, dockerfileNormalizedRelativeFilePath, tarOutputStream) .ConfigureAwait(false); } } diff --git a/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs b/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs index c68f0be6e..82c4d4ef8 100644 --- a/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs +++ b/tests/Testcontainers.Tests/Unit/Images/ImageFromDockerfileTest.cs @@ -78,6 +78,40 @@ public async Task DockerfileArchiveTar() Assert.Equal(expected, actual); } + [Fact] + public async Task IgnoredDockerfileIsCopiedToTarball() + { + // Given + + // This test ensures Dockerfiles in subdirectories are copied to the right paths + // in the tarball, instead of ending up at the root directory: + // https://github.com/testcontainers/testcontainers-dotnet/issues/1557. + IImage image = new DockerImage("localhost/testcontainers", Guid.NewGuid().ToString("D"), string.Empty); + + var actual = new SortedSet(); + + var buildArguments = new ReadOnlyDictionary(new Dictionary()); + + var dockerfileArchive = new DockerfileArchive(null, "Assets/", "target/Dockerfile", image, buildArguments, NullLogger.Instance); + + var dockerfileArchiveFilePath = await dockerfileArchive.Tar(TestContext.Current.CancellationToken) + .ConfigureAwait(true); + + // When + using (var tarOut = new FileStream(dockerfileArchiveFilePath, FileMode.Open, FileAccess.Read)) + { + using (var tarIn = TarArchive.CreateInputTarArchive(tarOut, Encoding.Default)) + { + tarIn.ProgressMessageEvent += (_, entry, _) => actual.Add(entry.Name); + tarIn.ListContents(); + } + } + + // Then + Assert.Contains("target/Dockerfile", actual); + Assert.DoesNotContain("Dockerfile", actual); + } + [Fact] public async Task ThrowsDockerfileDoesNotExist() {