2
0

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でGo×Air×Delveの開発環境を構築してみる(+MySQL)

Last updated at Posted at 2025-06-18

はじめに

どうも、水無月せきなです。
Goの勉強のために小さなアプリを作ろうと思い立ったので、そのための環境構築に至る手順を備忘録的に記します。

また、この記事を元に構築した環境でGoのアプリを開発しました。
そちらの技術解説記事をシリーズとして書いたので、合わせてお読み下さい!

環境

Windows 10 22H2
WSL2
Docker Desktop 4.41.2
Cursor 0.51.2

事前準備

  • WSLの設定・Dockerはインストール済み
  • gitignoreは作成済み

環境の構築

設定ファイルなどの準備

(1)Dockerfilecompose.ymlを作成する

Dockerfile
FROM golang:latest

ARG UID=20000
ARG GID=20000
RUN groupadd -g $GID dev \
    && useradd -m -u $UID -g $GID dev
# bashに変更
RUN chsh -s /bin/bash dev
USER dev

WORKDIR /app
COPY --chown=dev:dev . .

RUN go install -v github.com/air-verse/air@latest
RUN go install -v github.com/go-delve/delve/cmd/dlv@latest
compose.yml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        UID: ${UID:-20000}
        GID: ${GID:-20000}
    tty: true
    volumes:
      - .:/app
    ports:
      - 8080:8080
      - 2345:2345

(2)自身のUIDとGIDを調べる
環境を作るだけなら不要だと思いますが、パーミッション周りで面倒が起きないようにやります。

bash
$ whoami
user
$ id user
uid=1000(user) gid=1000(user)……(後略)

(3).envファイルを作成する
.envファイルを作成し、(2)で調べたUIDとGIDを記載します。
この時、.envファイルはgitignoreで管理から外してください。

.env
UID=1000
GID=1000

(4)launch.jsonを追加する
デバッグ用の設定を記載します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach to Remote Delve",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "remotePath": "${workspaceFolder}",
            "port": 2345,
            "host": "localhost",
            "showLog": true,
            "console": "integratedTerminal",
            "trace": "verbose"
        }
    ]
}

DevContainerの設定ファイルを作成

(1)エディター左下の><をクリックする
go-todo-0.png

(2)ポップアップするコマンドパレットからメニューを選択する
Add Dev Container Configuration Files…を選択してください。

go-todo-1.png

(3)From 'compose.yml'を選択する
今回はcompose.ymlを作成しているため、こちらを選択します。
go-todo-2.png

(4)Featureを選択する
任意ですが、GoのFeatureを一つ入れました。
go-todo-3.png

(5)Featureの設定をする
今回はデフォルトのままで進行します。
go-todo-4.png

(6)オプションの選択
任意ですが、一応dependabotを入れました。
go-todo-5.png

(7)作成されたdevcontainer.jsonの名前とworkspacefolderを変更する

変更前

devcontainer.json
{
	"name": "Existing Docker Compose (Extend)",
    
    ……中略……
    
	"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",

    ……後略……
}

変更後

devcontainer.json
{
	"name": "to-do-go-app-dev-container",

    ……中略……
    
	"workspaceFolder": "/app",

    ……後略……
}

(8)devcontainer用のcompose.ymlでボリュームのマウントを変更する
変更前

.devcontainer/docker-compose.yml
version: '3.8'
services:
  # Update this to the name of the service you want to work with in your docker-compose.yml file
  app:
    ……中略……

    volumes:
      # Update this to wherever you want VS Code to mount the folder of your project
      - ..:/workspaces:cached

    ……後略……
 

変更後

.devcontainer/docker-compose.yml
version: '3.8'
services:
  # Update this to the name of the service you want to work with in your docker-compose.yml file
  app:
    ……中略……

    volumes:
      # Update this to wherever you want VS Code to mount the folder of your project
      - .:/app:cached
  
  ……後略……
 

コンテナでの作業

(1)一度コンテナを起動する
エディタ左下の><をクリックし、ポップアップからReopen Containerを選ぶ
go-todo-6.png

(2)air initを実行する
立ち上がったコンテナで、air initを実行する(場所はルートディレクトリ)。
.air.tomlが生成されるので、cmdfull_binを修正する

[build]
  cmd = "go build -gcflags \"all=-N -l\" -o ./tmp/main"
  full_bin = "dlv exec --headless --listen=:2345 --accept-multiclient --continue ./tmp/main"

(3)go mod initを実行する
go.mod作成のため、go mod init {モジュール名}を実行します。

(4)devconatainer.jsonpostcreatecommandを修正
コンテナ起動時にAirも起動するように設定します。

devconatainer.json
	"postStartCommand": "cd /app && air -c .air.toml"

(5)Dockerfileも修正する

Dockerfile
FROM golang:latest

ARG UID=20000
ARG GID=20000
RUN groupadd -g $GID dev \
    && useradd -m -u $UID -g $GID dev
# bashに変更
RUN chsh -s /bin/bash dev
USER dev

WORKDIR /app
COPY --chown=dev:dev . .

RUN go mod tidy

RUN go install -v github.com/air-verse/air@latest
RUN go install -v github.com/go-delve/delve/cmd/dlv@latest

環境構築の終了

左下の><押下→ポップアップでRebuild Containerを選択します。
go-todo-7.png
go-todo-8.png

DBの追加

ここまででGoの開発・実行ができる環境は整いましたが、DBが無いので追加します。

(1)compose.ymlの修正
dbのセクションをまるっと追記し、appdepends_onも追記します。
また、DBへの接続情報を持つファイルを見れるようにします。

compose.yml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        UID: ${UID:-20000}
        GID: ${GID:-20000}
    depends_on:
      - db
    env_file:
      - ./db/db.env
    tty: true
    volumes:
      - .:/app
    ports:
      - 8080:8080
      - 2345:2345
  db:
    build:
      context: ./db
      dockerfile: db.Dockerfile
    env_file:
      - ./db/db.env
    ports:
      - 3306:3306
    volumes:
      - ./db/data:/var/lib/mysql

(2)DB用Dockerfileの追加
compose.ymlimageを指定しても良いと思いますが、今回はDockerfileで作ってみます。

db.Dockerfile
FROM mysql:8.0-debian

RUN apt-get update && \
    apt-get install -y locales

RUN locale-gen ja_JP.UTF-8

RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8

ENV LANG=ja_JP.UTF-8
ENV TZ=Asia/Tokyo

(3)db.envに接続情報を追記する
DB接続のための情報をdb.envファイルに記載します。

db/db.env
MYSQL_ROOT_PASSWORD=mysql
MYSQL_DATABASE=mysql_study
MYSQL_USER=mysql
MYSQL_PASSWORD=mysql

(4).gitignoreの修正
gitのコミットにDB関連が含まれてしまうため、含まれないようにします。

.gitignore
……前略……
db/data/
db/db.env

(5)Airの設定ファイル.air.tomlを修正する
デフォルトのままだと、DBのデータ保存先としてマウントしたフォルダも監視するため、権限エラーになってしまいます。
そのため、buildの項目のexclude_dirにDBのデータ保存先のフォルダを指定します。

.air.toml
[build]
  # ……中略……
  exclude_dir = ["assets", "tmp", "vendor", "testdata", "db"]
  # ……後略……

(6)コンテナをリビルドする
左下の><押下→ポップアップでRebuild Containerを選択します。
DevContainerの外で作業していた場合は、Reopen Containerでリビルドが走ると思います。

参考文献

Dev Container での環境構築

DevContainer起動後のコマンド実行

Dockerのパーミッション問題について

DB(MySQL)の構築について

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?