1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rootless Dockerコンテナ内でtestcontainers-goを使ったテストを動かしたい

Posted at

私が所属している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_DISABLEDtrueをセットし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コンテナのログ取得失敗によりテストが失敗するため
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?