🚢

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に入れる。
        • 立ち上げ時にはマイグレーションする。
  • 開発環境の統一
    • 拡張機能や設定を統一できる。
      • フォーマッタやリンタの設定。
      • 言語ごとに使うフォーマッタの設定。
      • ファイル保存時にフォーマットする。
      • ※上記は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コンテナを使う。

参考記事

株式会社ログビー(Logbii, Inc.)

Discussion