diff --git a/Testcontainers.slnx b/Testcontainers.slnx index 9606ccd28..d9461779b 100644 --- a/Testcontainers.slnx +++ b/Testcontainers.slnx @@ -66,7 +66,7 @@ - + @@ -139,7 +139,7 @@ - + diff --git a/src/Testcontainers/Containers/TarOutputMemoryStream.cs b/src/Testcontainers/Containers/TarOutputMemoryStream.cs index b5abe7a10..0803484bc 100644 --- a/src/Testcontainers/Containers/TarOutputMemoryStream.cs +++ b/src/Testcontainers/Containers/TarOutputMemoryStream.cs @@ -36,7 +36,7 @@ public TarOutputMemoryStream(string targetDirectoryPath, ILogger logger) /// /// The logger. public TarOutputMemoryStream(ILogger logger) - : base(new MemoryStream(), Encoding.Default) + : base(new MemoryStream(), TarArchiveDefaults.TarBlockFactor, Encoding.Default) { _logger = logger; IsStreamOwner = false; diff --git a/src/Testcontainers/Images/DockerfileArchive.cs b/src/Testcontainers/Images/DockerfileArchive.cs index db1f24af1..7d049deb1 100644 --- a/src/Testcontainers/Images/DockerfileArchive.cs +++ b/src/Testcontainers/Images/DockerfileArchive.cs @@ -10,8 +10,8 @@ namespace DotNet.Testcontainers.Images using System.Threading.Tasks; using DotNet.Testcontainers.Configurations; using ICSharpCode.SharpZipLib.Tar; - using Microsoft.Extensions.Logging; using JetBrains.Annotations; + using Microsoft.Extensions.Logging; /// /// Generates a tar archive with Docker configuration files. The tar archive can be used to build a Docker image. @@ -192,7 +192,7 @@ public async Task Tar(CancellationToken ct = default) using (var tarOutputFileStream = new FileStream(dockerfileArchiveFilePath, FileMode.Create, FileAccess.Write)) { - using (var tarOutputStream = new TarOutputStream(tarOutputFileStream, Encoding.Default)) + using (var tarOutputStream = new TarOutputStream(tarOutputFileStream, TarArchiveDefaults.TarBlockFactor, Encoding.Default)) { tarOutputStream.IsStreamOwner = false; diff --git a/src/Testcontainers/TarArchiveDefaults.cs b/src/Testcontainers/TarArchiveDefaults.cs new file mode 100644 index 000000000..33a85682e --- /dev/null +++ b/src/Testcontainers/TarArchiveDefaults.cs @@ -0,0 +1,14 @@ +namespace DotNet.Testcontainers +{ + internal static class TarArchiveDefaults + { + // Keep the record size equal to the block size (512 B) so SharpZipLib does + // not write extra zero padding beyond the two standard EOF blocks. The + // default factor of 20 produces ~8 KB of zeros after EOF, which can trigger + // a race in Podman's archive handler. The tar subprocess exits after the EOF + // blocks while the HTTP sender is still flushing the padding, causing EPIPE + // (HTTP 500 "broken pipe"). See: + // https://github.com/testcontainers/testcontainers-dotnet/issues/1683. + internal const int TarBlockFactor = 1; + } +}