既存のDockerfileからDevContainerを作成する方法についてまとめました。
1. Dockerfile
今回は以下のようなPython環境のDockerfileを例に説明します。
dockerfile
FROM python:3
USER root
RUN apt-get update
RUN apt-get -y install locales && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
RUN apt-get install -y vim less \
&& pip install --upgrade pip \
&& pip install --upgrade setuptools
COPY requirements.txt workspace/
RUN pip install -r workspace/requirements.txt
2. DevContainerとは
DevContainerは、VSCodeの拡張機能「Dev Containers」を使用して、Dockerコンテナ内で開発を行うための仕組みです。これにより、開発環境の差異による問題を解消し、チーム全体で同じ環境での開発が可能になります。
前提条件
- Docker Desktop または Docker Engine がインストールされていること
- VSCodeがインストールされていること
- VSCodeの拡張機能「Dev Containers」がインストールされていること
手順
-
.devcontainerディレクトリの作成
プロジェクトのルートディレクトリに.devcontainer
ディレクトリを作成します。mkdir .devcontainer
-
devcontainer.jsonの作成
.devcontainer/devcontainer.json
ファイルを作成し、既存のDockerfileを参照する設定を記述します。{ "name": "Python Project DevContainer", "build": { "dockerfile": "../Dockerfile", "context": ".." }, "customizations": { "vscode": { "extensions": [ "ms-python.python", "ms-python.vscode-pylance", "ms-azuretools.vscode-docker" ], "settings": { "terminal.integrated.shell.linux": "/bin/bash", "python.defaultInterpreterPath": "/usr/local/bin/python", "python.linting.enabled": true, "python.linting.pylintEnabled": true } } }, "forwardPorts": [8000], "postCreateCommand": "pip install -r requirements.txt", "remoteUser": "root", "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind", "workspaceFolder": "/workspace" }
-
設定のカスタマイズ
- Dockerfileがプロジェクトルート以外にある場合:
{ "build": { "dockerfile": "../docker/Dockerfile", "context": ".." } }
- Dockerfileでビルド引数を使用している場合:
{ "build": { "dockerfile": "../Dockerfile", "context": "..", "args": { "PYTHON_VERSION": "3.11", "DEBIAN_FRONTEND": "noninteractive" } } }
- 追加のボリュームマウントが必要な場合:
{ "mounts": [ "source=${localWorkspaceFolder}/.venv,target=/workspace/.venv,type=bind,consistency=cached", "source=vscode-extensions,target=/root/.vscode-server/extensions,type=volume" ] }
- 開発環境用の環境変数を設定する場合:
{ "containerEnv": { "PYTHONPATH": "/workspace", "FLASK_ENV": "development", "FLASK_DEBUG": "1" } }
-
requirements.txtの配置に関する注意点
サンプルのDockerfileではrequirements.txt
をworkspace/
にコピーしていますが、DevContainerでは作業ディレクトリが異なる可能性があるため、以下のような対応が必要です。-
devcontainer.jsonでビルドコンテキストを調整:
{ "build": { "dockerfile": "../Dockerfile", "context": "..", "target": "development" // マルチステージビルドの場合 } }
-
postCreateCommandで依存関係をインストール:
{ "postCreateCommand": "if [ -f requirements.txt ]; then pip install -r requirements.txt; fi" }
-
-
docker-compose.ymlを使用する場合
{ "name": "My Project DevContainer", "dockerComposeFile": [ "../docker-compose.yml", "docker-compose.extend.yml" ], "service": "app", "workspaceFolder": "/workspace", "customizations": { "vscode": { "extensions": [ "ms-azuretools.vscode-docker" ] } } }
-
DevContainerの起動
- VSCodeでプロジェクトを開く
- コマンドパレット(Cmd/Ctrl + Shift + P)を開く
- 「Dev Containers: Reopen in Container」を選択
- 初回はDockerイメージのビルドが行われる
3. トラブルシューティング
ビルドエラーが発生する場合
- Dockerfileのパスが正しいか確認
- contextの設定が適切か確認
- Dockerfileの構文エラーがないか確認
拡張機能が動作しない場合
- DevContainer内で拡張機能がインストールされているか確認
- 拡張機能の互換性を確認
- DevContainerを再ビルド
パフォーマンスが悪い場合
- ボリュームマウントの最適化を検討
.dockerignore
ファイルで不要なファイルを除外- キャッシュの活用を検討
日本語環境での文字化けが発生する場合
サンプルのDockerfileのように日本語ロケールが設定されていても、DevContainer内で文字化けする場合:
{
"containerEnv": {
"LANG": "ja_JP.UTF-8",
"LC_ALL": "ja_JP.UTF-8"
}
}
今回はここまでです。