🙆‍♀️

VSCodeのRemote ContainerでGo+MySQLの環境を簡単構築

2022/05/08に公開

初めに

最近Goを勉強しており、気軽に環境を構築できるプロジェクトをGitHubに上げてみました。
Go触ってみたいけど、環境構築面倒…という方がいましたら是非試してみてください。

https://github.com/mitsumitsu3/go-docker

フレームワークにEcho、DBはMySQLを使用し、サンプルとしてCRUD処理ができるREST APIを実装しています。
(ついでにphpMyAdminのコンテナも用意しています)
Goのバージョン:1.18
Echoのバージョン:v4.7.2

Docker Desktop for Mac(M1、Intel)で動作確認しています。
(Windowsでは確認できていません…)
ぱぱっと試したい方は、環境構築からやっていただければと思います。

Remote Container

今回の環境は、VSCodeの拡張機能のRemote Containerを使用しています。

https://code.visualstudio.com/docs/remote/remote-overview

Dockerのコンテナ内でVSCodeを開いて開発することができ、自動補完等を有効にするための拡張機能や設定などをコンテナの中に閉じ込めることができます。
メリットとしては、例えばチームで開発の際、皆でプラグインや設定を合わせるために環境構築の手順書に記載、それを見ながら各自が手動でインストール、といった作業が必要なくなります。
メンバーはソースコードを落としてきて、ちょっとポチポチするだけで他と同じ環境がコンテナ内に出来上がるイメージです。
ローカル側はRemote Containerを入れる以外は汚れることが無いため、その他のプロジェクトにも影響が発生しません。

拡張機能や設定をおこなっているのが、 .devcontainer/devcontainer.json となります。
詳しくは実際にGitHubのファイルを見ていただければ良いのですが、かなりざっくり簡単に解説すると
"settings": {
ここで、VSCodeの設定をおこなっています。

"extensions": [
ここで、VSCodeに入れる拡張機能を指定します。
VSCodeの拡張機能一覧で、入れたい拡張機能を探して右クリック→Copy Extension Idで拡張機能のIDが取得できるため、それを貼り付けるだけです。

これら二つの記述は、これまでもチーム開発で環境を一致させるためにそれぞれ .vscode ディレクトリ配下にsettings.jsonextensions.jsonを配置し、同じような内容を記述して運用されていました。

ただ、extensions.jsonに関してはあくまで推奨拡張機能を設定するものです。
このファイルが存在するプロジェクトを開いた際、「このリポジトリにお勧めの拡張機能をインストールしますか?」といった通知が現れ、インストールを選択すると設定された拡張機能がインストールされるというもので、結局のところローカルのVSCodeに拡張機能を入れることになります。

Remote Containerではあくまでもローカル環境には影響無く、コンテナ内にだけ拡張機能を適用させられる部分が、最大の違いかと思います。

環境構築

前提:Docker Desktop、VSCodeインストール済みであること

1. まずVSCodeにRemote Containerをインストールします。

左のメニューから拡張機能のインストールを開き、「remote container」等で検索し、インストール。

2. 続いて、GitHubからプロジェクトをクローンします。

$ git clone https://github.com/mitsumitsu3/go-docker.git

3. クローンしたプロジェクトを、VSCodeで開きます。

4. 左下のマークから、「Reopen in Container」を選択します。


すると自動的にdocker-compose.ymlを見に行きコンテナがビルドされ、立ち上がります。

5. 下の方に「Dev Container:Go」と表示されていれば立ち上がっています。

これで環境構築は完了です。

実際にソースコードを軽く触って、コードジャンプが可能なことや、コード補完ができることをご確認ください。

サーバー起動

VSCodeのターミナルは、既にGoのコンテナ内に入った状態となっているかと思います。
(root@コンテナID:/var/www#とかなっていたらコンテナ内です)
そうでない場合は、おそらく「ターミナル→新しいターミナル」等で新しく開くことで、表示されると思います。

サーバー起動のためのmain.goファイルはsrcディレクトリ配下にあるため、下記コマンドを実行することでサーバーが立ち上がります。

# go run src/main.go

下記のように表示されたら、サーバーが起動している状態です。

試しにcurl等で動作を確認してみます。

ホスト側のターミナル等からでも、下記を打つことで、データを登録することができます。
$ curl -X POST http://localhost:8080/user -d "name=Mitsu&age=24"

登録された内容が返却されてきます。
{"id":1,"name":"Mitsu","age":24,"created_at":"2022-05-06T03:30:43.916Z","updated_at":"2022-05-06T03:30:43.916Z"}

phpMyAdminもポート4848で立てているので、ブラウザから http://localhost:4848 にアクセスすることでDBの確認を行うことができます。

他、PUT、GET、DELETEで送信することで他の処理を実行可能です。

取得
$ curl -X GET http://localhost:8080/user/1
更新
$ curl -X PUT http://localhost:8080/user/1 -d "name=Change&age=25"
削除
$ curl -X DELETE http://localhost:8080/user/1

ステップデバッグ

ステップデバッグもできるようにしてあるので、試してみます。VSCode内のターミナルにて、サーバー起動している状態の場合は Ctrl+C 等で停止します。

続いて左のメニューから下記画像のアイコンを選択し、「実行とデバッグ」部分がdebugとなっていることを確認し、緑の三角ボタンを押下します。

しばらく待ち、画面下部がオレンジ色になったらサーバーが起動した状態です。

試しにsrc/controller/user_controller.goCreateUserメソッドにブレークポイントを配置します。
(行番号の左あたりをクリックすることでブレークポイントが置けます)

再び、登録処理のcurlを打ってみます。
curl -X POST http://localhost:8080/user -d "name=test&age=20"


止まりました。画面上部のアイコンをそれぞれ押下することで、一般的なステップデバッグと同じでステップイン、ステップオーバー等で確認ができます。

その他

今回立てている内Goのコンテナは、なるべくそのままローカル以外の他の環境でも利用することを想定して、DBへの接続情報等も環境変数を参照し、なるべくステートレス(状態を持たない)なコンテナとしています。
今後はGitHubActionsを利用してCI環境を構築したり、GoのコンテナのみビルドしてECRにプッシュしたりといったことを挑戦してみようかと思っています。

こちらの環境について、うまく動かない、Windowsでの動作、記事に誤りがある等、何かありましたらコメントいただけると嬉しいです。

Discussion