はじめに
どうも、水無月せきなです。
Goの勉強のために小さなアプリを作ろうと思い立ったので、そのための環境構築に至る手順を備忘録的に記します。
また、この記事を元に構築した環境でGoのアプリを開発しました。
そちらの技術解説記事をシリーズとして書いたので、合わせてお読み下さい!
環境
Windows 10 22H2
WSL2
Docker Desktop 4.41.2
Cursor 0.51.2
事前準備
- WSLの設定・Dockerはインストール済み
- gitignoreは作成済み
環境の構築
設定ファイルなどの準備
(1)Dockerfile
とcompose.yml
を作成する
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
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を調べる
環境を作るだけなら不要だと思いますが、パーミッション周りで面倒が起きないようにやります。
$ whoami
user
$ id user
uid=1000(user) gid=1000(user)……(後略)
(3).envファイルを作成する
.env
ファイルを作成し、(2)で調べたUIDとGIDを記載します。
この時、.envファイルはgitignoreで管理から外してください。
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の設定ファイルを作成
(2)ポップアップするコマンドパレットからメニューを選択する
Add Dev Container Configuration Files…
を選択してください。
(3)From 'compose.yml'
を選択する
今回はcompose.ymlを作成しているため、こちらを選択します。
(4)Featureを選択する
任意ですが、GoのFeatureを一つ入れました。
(5)Featureの設定をする
今回はデフォルトのままで進行します。
(6)オプションの選択
任意ですが、一応dependabot
を入れました。
(7)作成されたdevcontainer.json
の名前とworkspacefolder
を変更する
変更前
{
"name": "Existing Docker Compose (Extend)",
……中略……
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
……後略……
}
変更後
{
"name": "to-do-go-app-dev-container",
……中略……
"workspaceFolder": "/app",
……後略……
}
(8)devcontainer用の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
……後略……
変更後
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
を選ぶ
(2)air init
を実行する
立ち上がったコンテナで、air init
を実行する(場所はルートディレクトリ)。
.air.tomlが生成されるので、cmd
とfull_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.json
のpostcreatecommand
を修正
コンテナ起動時にAirも起動するように設定します。
"postStartCommand": "cd /app && air -c .air.toml"
(5)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
を選択します。
DBの追加
ここまででGoの開発・実行ができる環境は整いましたが、DBが無いので追加します。
(1)compose.yml
の修正
db
のセクションをまるっと追記し、app
にdepends_on
も追記します。
また、DBへの接続情報を持つファイルを見れるようにします。
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.yml
でimage
を指定しても良いと思いますが、今回は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
ファイルに記載します。
MYSQL_ROOT_PASSWORD=mysql
MYSQL_DATABASE=mysql_study
MYSQL_USER=mysql
MYSQL_PASSWORD=mysql
(4).gitignore
の修正
gitのコミットにDB関連が含まれてしまうため、含まれないようにします。
……前略……
db/data/
db/db.env
(5)Airの設定ファイル.air.toml
を修正する
デフォルトのままだと、DBのデータ保存先としてマウントしたフォルダも監視するため、権限エラーになってしまいます。
そのため、build
の項目のexclude_dir
にDBのデータ保存先のフォルダを指定します。
[build]
# ……中略……
exclude_dir = ["assets", "tmp", "vendor", "testdata", "db"]
# ……後略……
(6)コンテナをリビルドする
左下の><押下→ポップアップでRebuild Container
を選択します。
DevContainerの外で作業していた場合は、Reopen Container
でリビルドが走ると思います。
参考文献
Dev Container での環境構築
DevContainer起動後のコマンド実行
Dockerのパーミッション問題について
DB(MySQL)の構築について