🚢
DevContainerの基本
今回の想定読者
今回のネタは、DevContainerについてです。本記事を読んでいただけると、DevContainerの基本的な概念やメリット・デメリット、ライフサイクルなどについて、外観を掴むのに役立つと思います。
以下の様な方が想定読者です。
- DevContainerは興味があるけど、使ったことがないので外観を掴みたい
ログビーの勉強会について
ログビー(Logbii)では、月一回オンラインの社内勉強会をしています。直近のものと、2025年以降のアーカイブを順次公開していきます。
ざっくりと、以下のルールで運用をしています。
- 月イチで、ランチタイムにオンライン開催(1時間)
- テーマ自由
- 持ち回りで開催
- ランチ代支給(2000円まで)、飲食可
- 業務時間扱いでOK(業務時間を削る形でよい)
今回の勉強会について
今回は、2025年4月の勉強会アーカイブです。
フルスタックエンジニアのKumeさんが発表しました!
それでは、以下本編です。
DevContainerの基本
最初に
以下の人、いますか?(zoomのスタンプでリアクションしてね!)
- devcontainerを知っている🙋♂️
- devcontainerを使っている・使ったことがある🙋♂️
devcontainerをテーマに選んだ理由
- 個人開発で使っていて便利だったので共有したい。
- EnBrewに取り入れたい。
- 「EnBrewのコードでフォーマットすると差分がたくさん発生する。。。」と相談いただいたので、早めに導入したいと思った。
- 今後入社予定の人もいるので、EnBrew開発に早く入れるようにしたい。
- 今は別Solutionになったので、またEnBrewの開発に入ったら対応したい。
- devcontainerを使っていると、最新技術を使って開発している感があるのでは。。。?🤔
devcontainerとは?
- VSCodeの開発環境構築支援ツール。
- VSCodeが開発環境として利用するDockerコンテナを作成してくれる。
- そのDockerコンテナ上には開発に必要なもの(db, lib, runtime..)も詰め込んでくれる。
- パッケージのインストールやデータの投入もしてくれる。
devcontainerのメリット・デメリット
メリット
- Dockerコンテナ内に開発で必要なものをすべて閉じ込める事ができる。
- ローカル環境を汚染しない。
- ローカル環境にインストールしている拡張機能や設定によって、コードに差異が生じる可能性をなくせる。
- フォーマッタとか
- ローカル環境にインストールしている拡張機能や設定によって、コードに差異が生じる可能性をなくせる。
- ローカル環境を汚染しない。
- 開発環境構築が容易。
- devcontainerのボリュームにリポジトリをクローンすれば、開発環境をまるっと準備できる。
- ただし
devcontainer.jsonが必要。
- ただし
- 構築時のヒューマンエラー発生率低減できる。
- コンテナ作成時のみ実行するコマンド、コンテナが開始されるたびに実行するコマンドなど設定できる。以下のような設定も可能。
- コンテナ作成時はテストデータをDBに入れる。
- 立ち上げ時にはマイグレーションする。
- コンテナ作成時のみ実行するコマンド、コンテナが開始されるたびに実行するコマンドなど設定できる。以下のような設定も可能。
- devcontainerのボリュームにリポジトリをクローンすれば、開発環境をまるっと準備できる。
- 開発環境の統一
- 拡張機能や設定を統一できる。
- フォーマッタやリンタの設定。
- 言語ごとに使うフォーマッタの設定。
- ファイル保存時にフォーマットする。
- ※上記は
settings.jsonでも設定可能。
- 拡張機能や設定を統一できる。
- GitHub Codespacesで開発もできる。
デメリット
- 最初の構築が大変
- DockerとDevContainerが必要。
- Dockerはデファクトスタンダードなので、デメリットではない?
devcontainerの使い所
- チーム開発
- 開発環境構築を容易にする。
- 統一した開発環境構築を準備できる。
- ヒューマンエラーを減らせる。
- 個人開発
- 同じ構成で別プロジェクトを立ち上げるとき、使い回せる。
- 拡張機能、設定を流用できる。
- 同じ構成で別プロジェクトを立ち上げるとき、使い回せる。
devcontainerのライフサイクル
| コマンド | 実行環境 | 実行タイミング | 実行回数 | 用途 |
|---|---|---|---|---|
| initializeCommand | ホストマシン | コンテナの作成中およびその後の起動時を含む、初期化中 | 1回以上 | |
| onCreateCommand | コンテナ | 開発コンテナの作成時 | 多分1回のみ | |
| postCreateCommand | コンテナ | コンテナが作成され、すべての依存関係がインストールされた後に実行される。 | 多分1回のみ | ライブラリやツールのインストール、プロジェクトのセットアップ、初期設定など |
| postStartCommand | コンテナ | コンテナが起動して開発環境が準備できた後に実行される。 | 1回以上 | サーバーの起動やデバッグ設定、リソースの初期化など |
| postAttachCommand | コンテナ | 開発者がコンテナに接続した際に実行される | 1回以上 | |
| onShutdownCommand | コンテナ | コンテナのシャットダウン前に実行される | 1回以上 | 終了前に開いているファイルの保存や、データのバックアップ、クリーンアップなど |
devcontainerの演習
- pythonやtypescriptの開発環境を構築する。
ディスカッション
- 今後EnBrewで使いたい技術(言語とかではなく、開発体験を向上できるようなもの)はありますか?
- その他
- 松田さん
- 他のエディタで使える?
- 大体のエディタでは使えそう(カーソル、パイチャーム)
- 検証・本番環境でどうやってdevcontainerを使っていくのか?
- 本番とかではDockerコンテナを使う。
- 他のエディタで使える?
- 松田さん
Discussion