🤖 I have created a release *beep* *boop*
---
##
[4.15.0-rc4](testcontainers-v4.15.0-rc3...testcontainers-v4.15.0-rc4)
(2026-06-11)
### Features
* extended configuration options for container.exec method
([#1050](#1050))
([7dee471](7dee471))
* **main:** enable typing for complete package
([237be27](237be27))
* **main:** make legacy imports available with deprecation notice
([ab6cca8](ab6cca8))
* **test:** start working on parallel-running tests (WIP!)
([2d24429](2d24429))
### Bug Fixes
* **arangodb:** replace deprecated add_hash_index with
add_persistent_index
([50bb202](50bb202))
* **aws:** wrong path of test
([38089b0](38089b0))
* **ci:** correct coverage paths
([b21eccd](b21eccd))
* **ci:** fix community test selection
([5287fc8](5287fc8))
* **ci:** ignore [@overload](https://github.com/overload) in coverage
([592c6d1](592c6d1))
* **ci:** ignore TYPE_CHECKING block in coverage
([3bdc561](3bdc561))
* **core/registry:** use relative import for _LocalRegistryContainer
([961e3d1](961e3d1))
* **core:** make is_podman respect resolved docker host
([#1048](#1048))
([6018da3](6018da3))
* **docs:** update docs reflecting new structure
([9427055](9427055))
* **doctests:** Ensure paths are correct
([f777673](f777673))
* **k3s:** replace tmpfs dict kwarg with with_tmpfs_mount()
([4d1da0c](4d1da0c))
* **keycloak:** disable SSL requirement for master realm after start
([2a85595](2a85595))
* **main:** adopt ci to new src structure
([dae421d](dae421d))
* **main:** adopt imports to new structure
([9155677](9155677))
* **rabbitmq:** declare queue as durable
([2622736](2622736))
* **ruff:** add **/*_example.py to per-file-ignores for T201
([01dbd16](01dbd16))
* **sftp:** remove redundant start() calls and fix SSH connection
options
([54cef56](54cef56))
* **trino:** increase default startup timeout from 30s to 60s
([2940501](2940501))
* **weaviate:** update and fix module
([5dd2aa1](5dd2aa1))
---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Co-authored-by: David Ankin <daveankin@gmail.com>
Follow-up to #1026 (auto-detect DOCKER_HOST from the current docker context).
Problem
is_podman() used a bare docker.from_env(), which ignores the host resolved by get_docker_host() and never sets use_ssh_client for SSH hosts.
When a remote daemon is configured via a docker context (and DOCKER_HOST is not exported), is_podman() hit the local default socket, failed, and silently returned False. Two consequences:
Fix
is_podman() now resolves the host the same way DockerClient does: it builds a client with the resolved base_url (and use_ssh_client=True for ssh://), and only falls back to docker.from_env() when no host is resolved.
Tests
Verified manually
Ran tests/core/test_core_ports.py and tests/core/test_docker_client.py against two remote backends over SSH:
Also simulated the Docker Desktop desktop-linux context from #757: get_docker_host() returns the context socket and is_podman() queries that same socket, returning False as expected.