0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

devcontainer メモ

Posted at

image.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に聞きました
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?