本セッションの登壇者
セッション動画
僕からは「Dev ContainersとTestcontainers」ということでお話をさせていただきます。よろしくお願いします。
早川と申します。3-shakeという会社でソフトウェアエンジニアをしていて、kubernetesに関する活動をしています。
開発環境をまるっとコンテナに
突然ですが、皆さんはどこでコンテナを利用していますでしょうか。よくあるパターンとしては、ローカルで確認の環境を作るためにDocker/Docker Composeを作ってウェブアプリケーションの環境を作る、GitHub Actions/CircleCIなどのCI/CD環境のジョブを動かす時にコンテナ上でジョブを動かす、本番環境や検証環境で実際のワークロードをKubernetesやECSを使って動かすといったところが、一般的なシチュエーションではないかと思います。
Dev ContainersとTestcontainers
今日紹介するDev ContainersとTestcontainersを使うと、ここに2つ増えるのではないかというのが今日のお話になります。Dev Containersを使って開発環境をまるっとコンテナ環境にしてしまう、Testcontainersを使うことでユニットテストやインテグレーションテストのテストコード内でコンテナを立ち上げたり落としたりして、必要に応じて柔軟に、手軽にコンテナを使ったテストができるようになります。
今日はこの2つを簡単にご紹介します。主にツール系の話になります。
ランタイムは用意済み、エディタのみで開発可能
開発環境をまるっとコンテナで動かすというのが具体的にどれくらいできるんだという話ですが、極論としてDockerとVS CodeなどのDev Containersをサポートしているエディタがあれば、それだけで開発が全部できます。たとえばGoで開発する際でもGoのランタイムなどは全部コンテナ内に用意されているので、手元の環境に用意する必要が一切ありません。もともとは、VS Codeの拡張機能の中にあるRemote Developmentといういろいろな機能がまとめて入ったパッケージの中にある1つだったと記憶していますが、今はVS CodeのLSPのようにDev Containersも独立した仕様になっていて、VS Code以外でも使えるようになっています。ただし、GitHub上のorg memberを見ると、全員マイクロソフトやGitHubの方なので、仕様の策定に関してはがっちり自分たちで握ってるんだろうなという感じがしています。
Dev Containersが使えるのは、VS Code やVisual Studio、JetBrains IntelliJ IDEA などです。あとは、GitHub Codespacesのようなリモート開発環境だったり、devcontainers cliというコマンドラインツールがあって、Vimやemacsを使われている方はそこと連携して使うことになるようです。
公式サイトの概要ページを見ると、こんな感じの図があります。この図自体はステージによって必要なライブラリなどが変わるという図ですが、いろいろな場面でDev Containersを使ってもらいたいということかもしれません。
使い方は簡単で、devcontainer
というディレクトリの中にdevcontainer.json
を置くというのが一般的なスタイルです。
デモで説明します。Goで作ったウェブサーバーをRedisに接続して、Redisのアクセスカウントを返すという簡単なアプリケーションです。(詳しくは動画をご覧ください)
これはすごく簡単な例なので、これぐらいだから使えたのではないかという話もあると思うんですけども、マージされるかどうかはまだ分かりませんが、KubernetesにDev Containersを導入できないかというPull Requestを上げています。KubernetesのDevelopers Guideというドキュメントに沿った形のDev Containersを作れたので、いろいろなプロジェクトでDev Containersが使えるようになると思います。ぜひDev Containersを使ってみてください。
今お話ししたいろいろな機能について、資料に書いてありますので、後で見直していただければと思います。
Dev Containersについてもっと詳しく知りたい方は、公式サイトを見たり、リファレンスの使用方法を書いたポストを見たり、先ほどのリファレンスのdevcontainers cli
というコマンドラインツールの実装を見てみたりするといいと思います。
テストコードの中でコンテナ起動や停止が自由自在
次はTestcontainersです。冒頭でも説明したとおり、ユニットテストやインテグレーションテストを実行する際に、テストコードの中でコンテナの起動や停止がサクっと行えるライブラリです。ユニットテストの中でコンテナを立ち上げたり、落としたりが手軽にできるので、たとえば、実際にDBを使うテストを同時並行で動かすような際にも、お互いに影響なく動かすことができるといったメリットがあります。また、提供されているライブラリの言語数が多いので、たいていのケースで利用できます。このように機能が充実しているので、少し前に開発元のAtmicJar社がDockerに買収されて話題になりました。
こちらについても簡単にデモをご紹介します。これは僕が作ったデモではなくて、公式のリポジトリにあるデモをそのまま使っています。
このリポジトリにある repo_test.go
が今回の題材で、TestCustomerRepository
というリポジトリ層のテストの様子です。あらかじめDocker composeでテスト用の構成を立てるなどを一切やらなくても、手軽にライブラリでコンテナが操作できるのですごく便利だと思います。(デモは動画を参照ください)
Testcontainersのメリットです。先ほどのDev Containersのように、よく使うコンテナのモジュールがたくさんあるのでとても便利ではないかと思います。
まとめとして、Dev ContainersとTestcontainersはいいぞ!ということで終わりたいと思います。
今回のセッションの内容の詳しい情報を Zennの記事に載せていますので、もしよければこちらも見ていただければと思います。以上です。ありがとうございました。