既存のDockerfileからDevContainerを作成する方法

2025-06-01

Docker
DevContainer
VSCode

既存の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」がインストールされていること

手順

  1. .devcontainerディレクトリの作成
    プロジェクトのルートディレクトリに.devcontainerディレクトリを作成します。

    mkdir .devcontainer
    
  2. 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"
    }
    
  3. 設定のカスタマイズ

    • 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"
        }
    }
    
  4. requirements.txtの配置に関する注意点
    サンプルのDockerfileではrequirements.txtworkspace/にコピーしていますが、DevContainerでは作業ディレクトリが異なる可能性があるため、以下のような対応が必要です。

    1. devcontainer.jsonでビルドコンテキストを調整

      {
      "build": {
          "dockerfile": "../Dockerfile",
          "context": "..",
          "target": "development"  // マルチステージビルドの場合
      }
      }
      
    2. postCreateCommandで依存関係をインストール

      {
      "postCreateCommand": "if [ -f requirements.txt ]; then pip install -r requirements.txt; fi"
      }
      
  5. 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"
                ]
            }
        }
    }
    
  6. DevContainerの起動

    1. VSCodeでプロジェクトを開く
    2. コマンドパレット(Cmd/Ctrl + Shift + P)を開く
    3. 「Dev Containers: Reopen in Container」を選択
    4. 初回はDockerイメージのビルドが行われる

3. トラブルシューティング

ビルドエラーが発生する場合

  1. Dockerfileのパスが正しいか確認
  2. contextの設定が適切か確認
  3. Dockerfileの構文エラーがないか確認

拡張機能が動作しない場合

  1. DevContainer内で拡張機能がインストールされているか確認
  2. 拡張機能の互換性を確認
  3. DevContainerを再ビルド

パフォーマンスが悪い場合

  1. ボリュームマウントの最適化を検討
  2. .dockerignoreファイルで不要なファイルを除外
  3. キャッシュの活用を検討

日本語環境での文字化けが発生する場合

サンプルのDockerfileのように日本語ロケールが設定されていても、DevContainer内で文字化けする場合:

{
    "containerEnv": {
        "LANG": "ja_JP.UTF-8",
        "LC_ALL": "ja_JP.UTF-8"
    }
}

今回はここまでです。