Description
Testcontainers version
3.6.0
Using the latest Testcontainers version?
Yes
Host OS
Windows
Host arch
x64
.NET version
8.0
Docker version
Client:
Cloud integration: v1.0.35+desktop.5
Version: 24.0.6
API version: 1.43
Go version: go1.20.7
Git commit: ed223bc
Built: Mon Sep 4 12:32:48 2023
OS/Arch: windows/amd64
Context: default
Server: Docker Desktop 4.25.2 (129061)
Engine:
Version: 24.0.6
API version: 1.43 (minimum version 1.12)
Go version: go1.20.7
Git commit: 1a79695
Built: Mon Sep 4 12:32:16 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.22
GitCommit: 8165feabfdfe38c65b599c4993d227328c231fca
runc:
Version: 1.1.8
GitCommit: v1.1.8-0-g82f18fe
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker info
Client:
Version: 24.0.6
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.11.2-desktop.5
Path: C:\Program Files\Docker\cli-plugins\docker-buildx.exe
compose: Docker Compose (Docker Inc.)
Version: v2.23.0-desktop.1
Path: C:\Program Files\Docker\cli-plugins\docker-compose.exe
dev: Docker Dev Environments (Docker Inc.)
Version: v0.1.0
Path: C:\Program Files\Docker\cli-plugins\docker-dev.exe
extension: Manages Docker extensions (Docker Inc.)
Version: v0.2.20
Path: C:\Program Files\Docker\cli-plugins\docker-extension.exe
init: Creates Docker-related starter files for your project (Docker Inc.)
Version: v0.1.0-beta.9
Path: C:\Program Files\Docker\cli-plugins\docker-init.exe
sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)
Version: 0.6.0
Path: C:\Program Files\Docker\cli-plugins\docker-sbom.exe
scan: Docker Scan (Docker Inc.)
Version: v0.26.0
Path: C:\Program Files\Docker\cli-plugins\docker-scan.exe
scout: Docker Scout (Docker Inc.)
Version: v1.0.9
Path: C:\Program Files\Docker\cli-plugins\docker-scout.exe
Server:
Containers: 3
Running: 0
Paused: 0
Stopped: 3
Images: 8
Server Version: 24.0.6
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 8165feabfdfe38c65b599c4993d227328c231fca
runc version: v1.1.8-0-g82f18fe
init version: de40ad0
Security Options:
seccomp
Profile: unconfined
Kernel Version: 5.15.133.1-microsoft-standard-WSL2
Operating System: Docker Desktop
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 7.76GiB
Name: KraytDragon
ID: c7775911-df14-4266-80e5-7513018d14f8
Docker Root Dir: /var/lib/docker
Debug Mode: false
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal
Experimental: false
Insecure Registries:
hubproxy.docker.internal:5555
127.0.0.0/8
Live Restore Enabled: false
WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support
WARNING: daemon is not using the default seccomp profile
What happened?
Trying to use Couchbase testcontainers in an NUnit test. Here's the intialization:
var couchbaseContainer = new CouchbaseBuilder()
.WithImage("couchbase:enterprise-7.2.2").Build();
wait couchbaseContainer.StartAsync();
This works fine around 50% of the time. The other 50% results in:
System.Net.Http.HttpRequestException : An error occurred while sending the request.
----> System.Net.Http.HttpIOException : The response ended prematurely. (ResponseEnded)
I've traced this to CouchbaseBuilder.cs -> ConfigureCouchbaseAsync
method. The first httpClient.SendAsync
is where the exception is happening. Maybe the earlier WaitUntilNodeIsReady
in the method isn't enough, and the rename node endpoint isn't quite ready?
So, I wrapped it in a crude retry:
var maxRetryAttempts = 3;
var retryDelay = TimeSpan.FromSeconds(5);
for (int attempt = 1; attempt <= maxRetryAttempts; attempt++)
{
try
{
using (var request = new RenameNodeRequest(container))
{
using (var response = await httpClient.SendAsync(request, ct).ConfigureAwait(false))
{
await EnsureSuccessStatusCodeAsync(response).ConfigureAwait(false);
break; // Success, exit the loop
}
}
}
catch (Exception ex) when (attempt < maxRetryAttempts)
{
// TODO: Log the exception
// Wait before retrying
await Task.Delay(retryDelay, ct);
}
}
And that seems to have stopped the exceptions. However, not being an expert in testcontainers, there might be something else I can do instead? Or maybe there's a better retry mechanism already in testcontainers that I can use instead of this? There are a bunch more HTTP requests in this method, maybe they could all benefit from a retry?
Any thoughts on this, or should I just submit a PR similar to this and go on with my life?
Relevant log output
Relevant log when successful:
[testcontainers.org 00:00:00.13] Connected to Docker:
Host: npipe://./pipe/docker_engine
Server Version: 24.0.6
Kernel Version: 5.15.133.1-microsoft-standard-WSL2
API Version: 1.43
Operating System: Docker Desktop
Total Memory: 7.76 GB
[testcontainers.org 00:00:00.32] Docker container a88bde86f517 created
[testcontainers.org 00:00:00.39] Start Docker container a88bde86f517
[testcontainers.org 00:00:00.76] Wait for Docker container a88bde86f517 to complete readiness checks
[testcontainers.org 00:00:00.77] Docker container a88bde86f517 ready
[testcontainers.org 00:00:00.89] Docker container 17237d653426 created
[testcontainers.org 00:00:00.91] Start Docker container 17237d653426
[testcontainers.org 00:00:02.52] Couchbase container is starting, performing configuration.
[testcontainers.org 00:00:25.54] Wait for Docker container 17237d653426 to complete readiness checks
[testcontainers.org 00:00:27.65] Docker container 17237d653426 ready
[testcontainers.org 00:00:27.65] Couchbase container is ready! UI available at http://127.0.0.1:37798/
Relevant log when failing:
System.Net.Http.HttpRequestException : An error occurred while sending the request.
----> System.Net.Http.HttpIOException : The response ended prematurely. (ResponseEnded)
Additional information
No response