私が所属しているQAIP開発チームのGoのテストではTestcontainers for Goを使用してPostgreSQLなどを起動しています。
私の開発環境はRootless Dockerコンテナ上に構築しているのですが、ホストやGitHub Actionsでは成功するテストがコンテナ上では失敗してしまいました。環境は下のとおりです。
- OS: Ubuntu 24.04.3 LTS
- Kernel: 6.14.0
- Docker Engine: 29.1.3
- Docker Context: rootless
- Cgroup: v2
- Storage Driver: overlay2
この記事ではtestcontainers/testcontainers-goのサンプルコードをRootless Dockerコンテナ上で動かしていきます。
まずは疑似開発環境としてRootless Dockerコンテナを起動します。Testcontainers for Goはコンテナを起動しますので、Dockerソケットをマウントします。
docker container run --rm -it -v /run/user/$(id -u)/docker.sock:/var/run/docker.sock golang:1.25.5-trixie bash
コンテナが起動したらコンテナ内でコードをクローンし、examples/nginxにあるテストを普通に実行してみます。
# git clone --depth 1 https://github.com/testcontainers/testcontainers-go.git /go/src/github.com/testcontainers/testcontainers-go
# cd /go/src/github.com/testcontainers/testcontainers-go/examples/nginx
# go test .
--- FAIL: TestIntegrationNginxLatestReturn (1.35s)
nginx_test.go:22:
Error Trace: /go/src/github.com/testcontainers/testcontainers-go/examples/nginx/nginx_test.go:22
Error: Received unexpected error:
generic container: create container: reaper: new reaper: run container: started hook: wait until ready: external check: check target: retries: 0 address: 172.17.0.1:33022: unexpected container status "removing": could not start container
Test: TestIntegrationNginxLatestReturn
FAIL
FAIL github.com/testcontainers/testcontainers-go/examples/nginx 1.358s
FAIL
テストが失敗しました。
testcontainers-goは最初のコンテナを起動するときにreaper(testcontainers/ryukのコンテナ)を起動します。testcontainers-goはそのreaperへのアクセスやHTTPStrategyなどでのアクセスで私の環境ではゲートウェイのIPにアクセスしていました。しかし、私の環境ではゲートウェイのIPにアクセスしてもホストのポートにアクセスはできません。
そこで、環境変数TESTCONTAINERS_HOST_OVERRIDEにホストのIPを指定して、そこに対しアクセスさせるようにします。
# TESTCONTAINERS_HOST_OVERRIDE=<ホストのIP> go test -v -count 1 .
=== RUN TestIntegrationNginxLatestReturn
2025/12/08 06:34:35 github.com/testcontainers/testcontainers-go - Connected to docker:
Server Version: 29.1.2
API Version: 1.51
Operating System: Ubuntu 24.04.3 LTS
Total Memory: 64029 MB
Testcontainers for Go Version: v0.41.0
Resolved Docker Host: unix:///var/run/docker.sock
Resolved Docker Socket Path: /var/run/docker.sock
Test SessionID: f9e5028026475eb92251017ab8bf5307f59860a498056ac0fb7c6bbf95b899c6
Test ProcessID: e377c207-2172-43db-ad70-279a30edcc84
2025/12/08 06:34:39 🐳 Creating container for image testcontainers/ryuk:0.13.0
2025/12/08 06:34:39 ✅ Container created: 377580b98abb
2025/12/08 06:34:39 🐳 Starting container: 377580b98abb
2025/12/08 06:34:39 ✅ Container started: 377580b98abb
2025/12/08 06:34:39 ⏳ Waiting for container id 377580b98abb image: testcontainers/ryuk:0.13.0. Waiting for: port 8080/tcp to be listening
2025/12/08 06:34:39 failed accessing container logs: Error response from daemon: can not get logs from container which is dead or marked for removal
2025/12/08 06:34:39 🐳 Stopping container: 377580b98abb
2025/12/08 06:34:39 ✅ Container stopped: 377580b98abb
2025/12/08 06:34:39 🐳 Terminating container: 377580b98abb
2025/12/08 06:34:39 🚫 Container terminated: 377580b98abb
nginx_test.go:22:
Error Trace: /go/src/github.com/testcontainers/testcontainers-go/examples/nginx/nginx_test.go:22
Error: Received unexpected error:
generic container: create container: reaper: new reaper: run container: started hook: wait until ready: external check: check target: retries: 0 address: <ホストのIP>:32819: unexpected container status "removing": could not start container
Test: TestIntegrationNginxLatestReturn
2025/12/08 06:34:39 🐳 Stopping container: d186486b23e6
2025/12/08 06:34:39 ✅ Container stopped: d186486b23e6
2025/12/08 06:34:39 🐳 Terminating container: d186486b23e6
2025/12/08 06:34:39 🚫 Container terminated: d186486b23e6
--- FAIL: TestIntegrationNginxLatestReturn (4.50s)
FAIL
FAIL github.com/testcontainers/testcontainers-go/examples/nginx 4.507s
FAIL
テストが失敗します。原因はわからないものの、ログを見るとtestcontainers/ryukのコンテナの起動はできているようですが、ログが取得できていません。同様の事象は https://github.com/testcontainers/testcontainers-go/issues/2477 にも報告があがっています。
そこで、環境変数TESTCONTAINERS_RYUK_DISABLEDにtrueをセットしreaperを無効にします。reaperは作成したコンテナやネットワーク、ボリュームなどをクリーンアップしてくれるものなのでできるだけ有効にしたいですが、明示的にクリーンアップし異常終了時などにリソースが残るリスクを承知してreaperを無効にします。
# TESTCONTAINERS_RYUK_DISABLED=true TESTCONTAINERS_HOST_OVERRIDE=<ホストのIP> go test .
ok github.com/testcontainers/testcontainers-go/examples/nginx 0.571s
テストが成功しました。
まとめ
私の環境でtestcontainers-goを動かすには、以下の環境変数を設定する必要がありました:
-
TESTCONTAINERS_HOST_OVERRIDE=<ホストのIP>- ゲートウェイIP経由でホストにアクセスできないため -
TESTCONTAINERS_RYUK_DISABLED=true- ryukコンテナのログ取得失敗によりテストが失敗するため