testcontainers
対応コンテナランタイム
- docker
- podman
ryuk的にはdockerのみ対応に見えるので実質dockerのみ対応?
testcontainers側はdockerもpodmanも同じプロバイダ実装を利用できてるのでryukでも行ける?
bind mountで /var/run/docker.sock
にmountしてるのでpodmanでもDocker APIとinterfaceが同じなら行けそう
ryukでもDocker SDK側の環境変数設定とかを使ってホストを切り替えできそうだけど、testcontainers側で /var/run/docker.sock
に決め打ちでmountしてるみたい
ryuk
まとめ
- 起動後に待ち受けるTCPポートに来たリクエストを保存
- 一定時間待機
- 待機後に保存した各条件にマッチする各種コンテナリソースをpruneするプログラム
- コンテナでも利用可能(DockerのGo SDK経由でpruneなどを実行)
- testcontainersから起動したテスト用コンテナのリソースを削除するために利用される
プログラム内容
- 起動後指定のTCPポートで待ち受け
- 待ち受けたポートのリクエストを保存
- 一定時間経過後(デフォルトでは60秒)もしくはリクエストから一定時間経過後(デフォルトでは10秒)に処理を開始
- メイン処理を実行(内容は下記):
- リクエスト毎に
container.ListOptions
に変換 -
container.ListOptions
条件に一致する下記のリソースを削除(prune)する- コンテナ
- イメージ
- ネットワーク
- ボリューム
- リソース別の削除件数を出力して終了
- リクエスト毎に
コンテナ
ryukはコンテナでも利用可能
(というよりはコンテナがメインに見える)
ドキュメント
参考記事
testcontainers-go
モジュールを使ってコンテナを作る
下記のドキュメントのサイドバーに利用可能なモジュール一覧と使い方がある
もしくは実装を直接見る
モジュール外のコンテナを作る
基本下記のドキュメントにあるようにGenericContainerを使用する
複数のコンテナを動かしたければParallelContainersを使う
(もしくは後述するDocker Composeを使う)
内部的にはGenericContainerRequestのリストなだけ
ラベル
session idを含めたコンテナなどに設定されるラベルはこちら
例えばコンテナに設定するラベルはこちら
セッションIDはこのあたりでハッシュ値が生成される
ライフサイクルフック
コンテナの起動などのタイミングで処理を挟むことができる
一覧はこちらにある
ちなみに
PostReadies - hooks that are executed after the container is ready
って書いてるけど実装上PostStartsの後にPostReadies実行してるだけなので、特にreadyになったとかを確認してるのかはよくわからない
↓このhookがデフォルトで設定されることでreadyになるのを待機できるらしい
イメージのpull
イメージのpullはこちらで行っている
pullの際には下記のライブラリを使ってExponential backoffが行われるので、1度pullに失敗してもリトライしてくれる
Stop
Stop処理はこんな感じ
Terminate
Terminate処理はこんな感じ
コンテナと(testcontainersでビルドしたイメージの場合)イメージの削除は行っている感じ
Wait
下記の種類のwaitを使ってコンテナの起動などを待機できるらしい
方法としてはライフサイクルフックのところにも書いたフックによって実現してる
既存のwait種別だと機能が足りないのであれば下記のinterfaceを満たした実装を作れば独自のwait strategyを作れそう
例えば health の wait strategy の場合は下記のように実装されている
ファイルコピー
下記のページにあるファイルをコンテナにコピーするやつ
下記にライフサイクルフックで実現されている
ネットワーク
ネットワークについてはこのページで書かれてる以上に特筆すべき点が特に無い
強いて言えば下記のようにネットワークを指定することで作ったネットワークをコンテナ側に反映できるくらい?
req := testcontainers.ContainerRequest{
Networks: []string{"foo"},
}
docker build
Dockerfileからイメージのビルドは別に特別なことは何もなくただビルドしてるだけ
Docker Compose
Docker Composeが使えるモジュール
普通にDocker ComposeのSDKを使ってるだけ
強いて言えばryukとかラベルの追加とかを行ってるのあたりは特徴と言えるかも
LogConsumer
ドキュメントにある通りログを収集したりできる機能
(interfaceがあるだけなので何かやりたかったらLogConsumerを自分で実装する必要あり)
実装例をみたければテストにある
起動後のコマンド実行
デスクトップアプリ
デスクトップアプリを起動してるとdockerをフックして?テスト結果をクラウド側に送ってクラウド側のダッシュボードでテスト結果を確認できるようになってるっぽい