こんにちは! アスクルの岡本です!
私は2021年入社で、現在はWebアプリケーション開発を担当しています。本記事では、新メンバーの受け入れ作業の効率化とKotlin開発におけるAI活用の拡大を目的に導入したDev Containersについて紹介します。
「開発環境の構築で時間を取られる」「チームメンバーごとに環境が異なって困る」「インターンなどの一時的なローカル環境の準備」といった課題を抱えている方の参考になれば幸いです。
Dev Containersとは?
Dev Containersは、Visual Studio Codeが提供する拡張機能で、開発環境をコンテナ化して統一する仕組みです。プロジェクトごとに必要な開発ツール、ライブラリ、設定を含んだDevelopment Container(開発コンテナ)を定義できます。
従来の開発環境の課題
チーム開発では次のような課題がよく発生します。
- 環境構築の複雑さ: 新メンバーの受け入れ作業に数日かかる
- 環境差異による問題:「私の環境では動く」問題の発生
- バージョン管理の困難: Node.js、Python等のバージョン違いによるトラブル
- 設定の属人化: 個人の環境設定に依存した開発
これらの課題を解決するのがDev Containersです。
導入背景と目的
インターン受け入れがきっかけに
今回、Webコースのインターンとして2週間、私たちの開発チームに参加してもらうことになりました。しかし、短期間のインターンシップで環境構築に多くの時間を費やすのは非効率的です。
これまで環境構築用のドキュメントはブラッシュアップしてきましたが、それでも新メンバーが一人で環境を構築するには3日程度かかってしまうのが現実でした。2週間という限られた期間で実際の開発業務を体験してもらうためには、環境構築時間を大幅に短縮する必要がありました。
VS Code + Kotlin LSPによるAI開発体験
Dev Containersを導入するにあたり、開発環境としてVS Codeを採用しました。最近JetBrains公式から提供されたKotlin Language Server(Kotlin LSP)を利用することで、コード補完や構文チェックを効率的に活用できるようになり、導入の大きな後押しとなりました。さらにGitHub Copilotを併用することで、静的解析と生成AIを組み合わせた先進的な開発体験を実現できます。
Kotlin LSPはVS Codeの拡張機能から簡単にインストール可能です。
これらが決め手となり、今回はインターン生の開発環境にDev Containersの導入を決めました。
実際の導入手順
導入対象の開発環境
今回Dev Containersを導入したプロジェクトの技術スタックは次のとおりです。
- Spring Boot
- Kotlin
- TypeScript
- gRPC
そのためJavaやNode.jsの実行環境が必要になります。従来は各メンバーが個別にローカルマシンにインストールしていましたがバージョン違いやOS依存の問題に加え、社内プロキシの外部ネットワークアクセス制限による接続トラブルなども発生していました。
1. 基本的なDev Containers設定
プロジェクトルートに .devcontainer ディレクトリを作成し、 devcontainer.json を配置します。
{ "name": "Sample Application", "build": { "context": "..", "dockerfile": "Dockerfile" }, "containerEnv": { "HTTP_PROXY": "http://proxy.example.com:8080", "HTTPS_PROXY": "http://proxy.example.com:8080", "NO_PROXY": "127.0.0.1,localhost" }, "customizations": { "vscode": { "extensions": ["jetbrains.kotlin"] } }, "forwardPorts": [8080], "initializeCommand": "sh .devcontainer/export-cert.sh", "postCreateCommand": "cat /etc/os-release", "shutdownAction": "stopContainer" }
devcontainer.jsonの各項目について
基本設定
name: コンテナの表示名。VS Code上で識別しやすい名前を設定build: Dockerfileを使用したカスタムイメージのビルド設定context: ビルドコンテキストのパスdockerfile: 使用するDockerfileのパス
ネットワークプロキシ設定
containerEnv: コンテナ内の環境変数設定HTTP_PROXY/HTTPS_PROXY: 社内プロキシサーバの設定NO_PROXY: プロキシを通さないホストの指定
forwardPorts: ホストマシンに転送するポート番号(Webアプリケーションは8080ポートで起動する)
VS Code拡張機能の自動インストール
customizations.vscode.extensions: コンテナ起動時に自動インストールされる拡張機能jetbrains.kotlin: Kotlin Language Server Protocol (LSP) 拡張機能
ライフサイクル管理
initializeCommand: コンテナ作成前にホスト側で実行するコマンド(後述の証明書エクスポート用のシェルを指定)postCreateCommand: コンテナ作成後に実行するコマンド(OS情報の確認)shutdownAction: VS Code終了時のコンテナ動作
2. 証明書インストール用のシェル
社内プロキシ環境でHTTPS通信するためには、企業の独自CA証明書をコンテナ内にインストールする必要があります。macOSのキーチェインから証明書を取得し、コンテナへエクスポートするシェルスクリプトを作成しました。これで、Dev Containers起動時に自動的に必要な証明書がコンテナ内で利用可能になります。
#!/bin/bash set -e CERT_NAME="YourCompanyCert" security find-certificate -c "$CERT_NAME" -p > ".devcontainer/corp_ca.crt" echo "証明書をエクスポートしました。"
.devcontainer 配下にcorp_ca.crtを出力します。
3. Dockerfile設定
開発環境に必要なJava、Node.js、および社内CA証明書を含むカスタムDockerイメージを作成します。企業環境特有の証明書処理も自動化されているため、開発者は複雑な設定を意識することなく開発に集中できます。
FROM ubuntu:22.04
WORKDIR /workspace
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=UTC
# 基本ツール類をインストール
RUN apt-get update; \
apt-get install -y --no-install-recommends \
tar wget ca-certificates gnupg2
# 証明書
COPY .devcontainer/corp_ca.crt /usr/local/share/ca-certificates/corp_ca.crt
RUN chmod 644 /usr/local/share/ca-certificates/corp_ca.crt; \
update-ca-certificates;
# Java
RUN wget -O - https://apt.corretto.aws/corretto.key | gpg --dearmor > /usr/share/keyrings/corretto-keyring.gpg && \
echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" > /etc/apt/sources.list.d/corretto.list && \
apt-get update && apt-get install -y java-17-amazon-corretto-jdk
ENV JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto
ENV PATH="$JAVA_HOME/bin:$PATH"
# 証明書(Java)
RUN "${JAVA_HOME}/bin/keytool" -importcert -trustcacerts -file /usr/local/share/ca-certificates/corp_ca.crt -alias corp-ca -keystore "${JAVA_HOME}/lib/security/cacerts" -storepass changeit -noprompt
# NodeJS
RUN wget -qO- https://deb.nodesource.com/setup_18.x | bash - && \
apt-get install -y nodejs
# キャッシュの削除
RUN rm -rf /var/lib/apt/lists/*;
基本環境設定
FROM ubuntu:22.04: 安定したLTSバージョンをベースイメージとして使用DEBIAN_FRONTEND=noninteractive: パッケージインストール時の対話モードを無効化TZ=UTC: タイムゾーンを統一
基本ツールのインストール
tar wget ca-certificates gnupg2: 後続の作業で必要な基本ツール群--no-install-recommends: 推奨パッケージを除外してサイズを最小化
企業CA証明書の処理
- シェルスクリプトでエクスポートした証明書をコンテナ内にコピー
update-ca-certificates: システム全体で証明書を有効化
Javaのインストール
- Amazon Corretto JDKを使用
JAVA_HOME環境変数の設定とPATHへの追加keytoolコマンドで企業CA証明書をJavaキーストアにインポート
参考:https://docs.aws.amazon.com/corretto/
Node.jsのインストール
- NodeSourceの公式リポジトリからNode.jsを取得
参考:https://github.com/nodesource/distributions/blob/master/DEV_README.md
最適化
rm -rf /var/lib/apt/lists/*: aptキャッシュの削除でイメージサイズを削減
導入効果とメリット
インターン生の環境構築時間を短縮
Before: 2-3日の環境構築時間(直近のプロジェクト参画者)
After: 1時間30分程度(初回コンテナビルド含む、アプリケーション起動から正常系動作まで)
新メンバーは次の手順だけで開発開始可能になりました。
- リポジトリをクローン
- VS CodeでDev Containersを起動
- 自動的に必要な拡張機能がインストール
- すぐに開発開始
運用で見えてきた課題と対策
課題1: Docker Desktopがやや不安定
問題
- Docker Desktopの起動失敗やリソース消費が激しい
- macOS環境でDockerが起動しない場合がある
対策
- Docker Desktopの定期的な再起動をチーム内で推奨
- 安定稼働に向けてのナレッジを収集
課題2: Kotlin LSPの機能不足
問題
- IntelliJ IDEAと比較してコード補完の精度が劣る
- 大規模プロジェクトでの構文解析速度の低下
- リファクタリング機能の一部が未対応
- デバッガー連携の不完全性
対策
- 今後のKotlin LSP機能向上にかなり期待😎
まとめ
今回のDev Containers導入により、インターン受け入れの効率化と最新のAI開発環境の統一を実現できました。
良かった点
環境構築の劇的な改善
- 実際に初回起動、動作確認までは圧倒的に早くなりました。これによって実装以外のカリキュラムもしっかり時間を取ることができ、実際の開発業務により多くの時間を割けるようになりました。
最新AI開発体験の実現
- VS Code + Kotlin LSP + GitHub Copilotにより最新のAI開発環境を提供しました。
今後の展望:開発環境を「資材」として捉える
今回の経験を通じて、開発環境を1つの「資材」として継続的にブラッシュアップしていくことの重要性を実感しました。
短期的なメリット
- リモート開発環境の標準化によるチーム生産性向上
- 新技術導入時の検証環境の即座構築
- 開発環境のバージョンアップ作業の効率化
長期的な可能性
- AIがデバッグする環境の即座構築による開発効率の革新
- クラウド開発環境(GitHub Codespaces等)との連携による場所を選ばない開発
今回の導入は、その第一歩として非常に価値のある取り組みでした。課題はありますが、得られる効果は投資に十分見合うものがあります。
開発環境の統一や新メンバー受け入れの効率化でお悩みの方は、ぜひDev Containersの導入を検討してみてください。
最後まで読んでいただき、ありがとうございました!