はじめに
現在弊社で参画しているプロジェクトでdevcontainerを用いた開発に感動したため、
自分で1から構築してみた備忘録として執筆した。
devcontainerとは
コンテナ技術であるDockerは言語のバージョンや設定をコードベースで統一することができるものの、
各開発者間でのコードエディターの設定を統一することまではできなかった。
例えばある開発者が保存時にフォーマッタを自動で適用する設定にしている一方で、別の開発者がその設定を行っていない場合にはソースコードの変更時に意図していない部分での変更が起こってしまう可能性がある。
そんなエディター同士の設定を統一することができるのがdevcontainerである。
devcontainerを用いることでインストールするVSCodeの拡張機能やワークスペースの設定値もコンテナ内にコードベースで定義することが可能となる。
つまりVSCodeの拡張機能を含めた環境を含めたコンテナを作成し、そのコンテナ中で開発することでエディタの設定を統一して開発することが可能となる。
なので新規参入者が入る度に推奨する拡張機能を一つ一つインストールして、追加設定をして、、、という手間を一気に削減できるすごい技術である。
参考)
https://code.visualstudio.com/docs/remote/containers#_trusting-your-workspace
実際に使ってみた
例としてGoとMySQLのAPIサーバーを構築した。
作成方法はかんたん3ステップ
- Dev Containers: Try a Dev Container Sample.. でGoの環境を作成
- 作成したDockerfileをビルドするdokcer-compose.yamlファイルを作成
- 共通設定の対象を.vscode/setting.json に記述
(今回はファイル末尾に改行を自動挿入、行末の半角スペースを削除を追加)
ここから Dev Containers: Reopen in Container でVSCodeがコンテナに接続してコンテナ上でファイルを編集できます。
サンプルのソースコード
https://github.com/tsukasaI/go_devcontainer
番外編 Goコードの解説
package main
import (
"database/sql"
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
)
func main() {
openDB()
http.HandleFunc("/", handler)
http.ListenAndServe(":8001", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
}
func openDB() {
_, err := sql.Open("mysql", "go_db:go_db@/go_db")
if err != nil {
panic(err)
}
fmt.Println("DB opend")
}
今回はコンテナで起動したMySQLサーバーに接続し、成功したらターミナルで"DB opend"
を出力し
localhost:8001にアクセスすると"Hello World"
とレスポンスが返ってくるプログラムを作成した。
docker-composeのvolumeでローカルPCでチーム開発している方に是非使ってほしい。