devcontainer メモ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/bddada63-5d4c-4057-a737-a2d2efa3dd36.png)

## はじめに

最近の開発は、`devcontainer` を使う事が多いですね。備忘録として投稿。
`VMware` いっぱい使っていた頃が懐かしい、、、

## 構成

```
.devcontainer
    │  .env
    │  devcontainer.json
    │  docker-compose.yml
    │  Dockerfile
    │
    └─docker
        └─workspace
                Dockerfile
```


## .devcontainer/docker/workspace/Dockerfile

### 概要

Ubuntu 24.04 ベースの開発環境

- 開発用ユーザー（vscode）の作成
- Java 21（Amazon Corretto）と Gradle 8.7 のインストール
- git や vim など基本的な開発ツールの導入
- SDKMAN を使って Java / Gradle を管理

### コード

```

# Ubuntu 24.04（最新LTS）をベースにしたDockerイメージを使用
FROM ubuntu:24.04

# ユーザー名を定義（デフォルトは vscode）
ARG USERNAME=vscode

# ユーザーが属するグループ名を定義（デフォルトは workspace）
ARG USER_GROUP_NAME=workspace

# ユーザーIDを指定（ホストと合わせることでファイル権限の不一致を防ぐ）
ARG USER_UID=1000

# グループIDを指定（同上）
ARG USER_GID=1000

# インストールするパッケージをまとめて変数に（可読性アップ）
ARG PKG="git vim curl unzip zip sudo"

# デフォルトのシェルを bash に変更（shではなくbash前提のコマンドを使うため）
SHELL ["/bin/bash", "-c"]

# パッケージの更新とインストール、ユーザー作成、sudo設定を一括で実行
RUN apt-get update \                                      # パッケージリストを最新に
    && apt-get install -y ${PKG} \                        # 必要なパッケージを一括でインストール
    && groupadd --gid ${USER_GID} ${USER_GROUP_NAME} \    # 指定したGIDでグループを作成
    && useradd --uid ${USER_UID} --shell /bin/bash --gid ${USER_GID} -m ${USERNAME} \  # 指定したUID/GIDでユーザー作成
    && echo %${USER_GROUP_NAME} ALL=\(ALL\) NOPASSWD:ALL > /etc/sudoers.d/${USER_GROUP_NAME} \  # パスワードなしでsudo可能に
    && chmod 0440 /etc/sudoers.d/${USER_GROUP_NAME}       # sudoersファイルの権限を安全な設定に

# JavaとGradleのバージョンを定義（SDKMANを使って後からインストールする）
ARG JAVA_VERSION=21.0.2-amzn
ARG GRADLE_VERSION=8.7

# 作成したユーザーでログインし、SDKMANを使ってJavaとGradleをインストール
RUN su ${USERNAME} --command \                            # vscodeユーザーとして以下を実行
    'curl -s "https://get.sdkman.io" | bash \             # SDKMANのインストールスクリプトを実行
    && source "${HOME}/.sdkman/bin/sdkman-init.sh" \      # SDKMANの初期化（環境変数の読み込み）
    && sdk install java "${JAVA_VERSION}" \               # 指定バージョンのJava（Amazon Corretto）をインストール
    && sdk install gradle "${GRADLE_VERSION}"'            # Gradleも同様にインストール

```

## .devcontainer/devcontainer.json

### 概要

VS Code の Dev Container機能で使用する構成ファイル

- docker-compose を使用してコンテナを立ち上げ
- vscode ユーザーとしてログイン
- Java + Spring Boot + Gradle 開発に必要な拡張機能を自動インストール
- ワークスペースのルートを /home/vscode/workspace に設定

### コード

```

{
  // このDevContainer設定の名前（VSCodeのUIなどで表示される）
  "name": "workspace",

  // 使用する docker-compose ファイル（相対パスで指定）
  "dockerComposeFile": ["docker-compose.yml"],

  // 開発作業用のサービス名。docker-compose.yml 内の `services.workspace` と一致させる
  "service": "workspace",

  // コンテナ内で開発者が作業するフォルダのパス（コンテナ内部の絶対パス）
  "workspaceFolder": "/home/vscode/workspace",

  // DevContainer起動時に使うユーザー名（通常はDockerfileで作成されたユーザー）
  "remoteUser": "vscode",

  // VSCodeが閉じられたときに実行する動作。`stopCompose` は docker-compose のサービスを停止
  "shutdownAction": "stopCompose",

  // コンテナ起動時に自動インストールするVSCode拡張機能の一覧
  "extensions": [
    "vscjava.vscode-java-pack",            // Java用の基本拡張パック（Language Supportなどを含む）
    "vscjava.vscode-spring-initializr",    // Springプロジェクトの作成を支援する拡張
    "vscjava.vscode-gradle"                // Gradleのプロジェクト管理/ビルド支援拡張
  ]
}


```

## .devcontainer/docker-compose.yml

### 概要

devcontainer.json を通じてこの構成が使われ、Java/SpringBoot 開発環境が立ち上げ

- Dockerfile のビルドに引数を使用し、柔軟にユーザーを構成
- ローカルプロジェクトを /home/vscode/workspace にマウント
- 必要に応じてポート 5555 を公開（デバッグやツール用）

### コード

```

# docker-composeのバージョン指定（機能の互換性のため3.9を指定）
version: "3.9"

services:
  # DevContainerで使う開発用サービスを定義（名前は workspace）
  workspace:
    # コンテナ名を指定（PROJECT_NAME環境変数があればそれを先頭に付ける。なければ"default"）
    container_name: ${PROJECT_NAME:-default}-workspace

    # Dockerfileのビルド設定
    build:
      # Dockerfileのあるディレクトリを指定（相対パスで指定）
      context: ./docker/workspace
      # Dockerfileで利用する引数（ユーザー名やUID/GID）を指定
      args:
        USERNAME: ${USERNAME:-vscode}                  # ユーザー名（環境変数USERNAMEがなければ"vscode"）
        USER_GROUP_NAME: ${USER_GROUP_NAME:-workspace} # グループ名（デフォルトはworkspace）
        USER_UID: ${USER_UID:-1001}                    # ユーザーID（ホストと揃える）
        USER_GID: ${USER_GID:-1011}                    # グループID（ホストと揃える）

    # 仮想端末(TTY)を有効化（ログや対話型ツールを正しく表示するため）
    tty: true

    # ホスト側の上の階層（../）をコンテナ内の作業ディレクトリにマウント
    volumes:
      - ../:/home/${USERNAME:-vscode}/workspace:cached
      # :cached をつけることでパフォーマンス向上（特にMacなどで効果あり）

    # ポート5555をコンテナからホストに向けて公開（Javaのデバッグやツール接続用に利用可能）
    ports:
      - 5555:5555


```

## .devcontainer/Dockerfile

### 概要

.devcontainer/docker-compose.yml や devcontainer.json と連携して、VSCode DevContainer のベースイメージをカスタマイズするためのファイルです。
現状は最小構成で、Microsoft 提供の devcontainers/base:bullseye をベースにしています。
追加の OS パッケージインストール処理はコメントアウトされており、必要に応じて拡張できます。

### コード

```
# 任意の Debian または Ubuntu ベースのイメージが使用可能であることを示すコメント
# Note: You can use any Debian/Ubuntu based image you want. 

# Microsoftが提供する DevContainer 用の基本イメージ（Debian bullseye ベース）を使用
FROM mcr.microsoft.com/devcontainers/base:bullseye

# ↓このセクションを使えば、OSパッケージを追加でインストールできる
# 必要があればコメントアウトを外し、apt installでパッケージを追加可能
# [Optional] Uncomment this section to install additional OS packages.
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
#     && apt-get -y install --no-install-recommends <your-package-list-here>
# ↑ `DEBIAN_FRONTEND=noninteractive` によって対話を防ぎ、自動でインストールを進める
# `--no-install-recommends` により不要な依存パッケージのインストールを省く

```

## おわりに

たまに起動しなくなるので、初心に戻って"起動"から確認しましょう！

---

** 参考（感謝）**

- AIに聞きました