├ .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": []
}
]
}