VSCode で DevContainer を使う最小限サンプル例

VSCode で DevContainer を使う最小限サンプル例

├ .devcontainer/
│ ├ devcontainer.json
│ ├ docker-compose.yml
│ └ Dockerfile
├ database/
│ └ init.sql
├ src/
│ └ main.sh
└ .vscode/
  └ tasks.json
.devcontainer/devcontainer.json

DevContainer の設定ファイルです。実行する Docker Compose ファイルを指定しています。Compose 内の “my-work” サービスを開発用のコンテナとして使う設定になっています。

{
  "name": "My Dev Container",
  "dockerComposeFile": "./docker-compose.yml",
  "service": "my-work",
  "workspaceFolder": "/work"
}
.devcontainer/docker-compose.yml

起動するコンテナ群を定義しています。開発用コンテナ “my-work” と MySQL のコンテナ “database” を定義しています。

services:
  my-work:
    build:
      context: ..
      dockerfile: .devcontainer/Dockerfile
    volumes:
      - ..:/work
    command: sleep infinity

  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: my_database
      MYSQL_USER: my_user
      MYSQL_PASSWORD: my_password
    volumes:
      - ../database:/docker-entrypoint-initdb.d
.devcontainer/Dockerfile

開発用コンテナ “my-work” の定義です。Ubuntu イメージをベースにし、そこに mysql-client をインストールしています。

FROM ubuntu:latest

USER root

RUN apt-get update && apt-get install -y \
  mysql-client \
  && rm -rf /var/lib/apt/lists/*
database/init.sql

データベース初期化用の SQL スクリプトです。users テーブルを作成し、サンプルデータを挿入しています。

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(50) UNIQUE NOT NULL,
  email VARCHAR(100) UNIQUE NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO users (username, email)
VALUES
  ('alice',  '[email protected]'),
  ('bob',    '[email protected]'),
  ('charlie','[email protected]');
src/main.sh

サンプルスクリプトです。MySQL クライアントを使ってデータベースに接続し、テーブル一覧と users テーブルの内容を表示します。

#!/bin/bash

echo "Hello, World!"

mysql -h database -u my_user -pmy_password my_database -e "SHOW TABLES;"

mysql -h database -u my_user -pmy_password my_database -e "SELECT * FROM users;"
.vscode/tasks.json

必須ではありませんが便利なタスク定義例です。不要なコンテナを一括削除するタスクを定義しています。

VSCode を閉じた際に DevContainer が停止します。このときコンテナは停止されますが削除はされません。このタスクを実行することで、停止したコンテナを一括削除できます。

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "docker container prune",
      "type": "shell",
      "command": "docker container prune -f",
      "problemMatcher": []
    }
  ]
}