はじめに
最近の開発は、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に聞きました