🐁

airを使ったGoサーバーのコンテナ開発でpkgをマウントする

2023/02/05に公開

はじめに

https://github.com/cosmtrek/air

  • いちいちコマンドでリビルドしたくない
  • 複数ターミナルを行き来したくない

などなど、airを使ったホットリロードは開発効率を爆上げしてくれます。

ただ、ローカル環境でdocker-compose.yamlに複数のコンテナを含めるようになると
なんどもdocker compose updocker compose downを繰り返すようになり
Goの依存関係をダウンロードする時間が鬱陶しくなります。

そこで/go/pkgディレクトリをマウントして2回目以降は依存関係のダウンロードを回避するようにしてみたというご紹介です。

開発環境

uname -a
Darwin MacBook-Pro-7.local 22.2.0 Darwin Kernel Version 22.2.0: Fri Nov 11 02:04:44 PST 2022; root:xnu-8792.61.2~4/RELEASE_ARM64_T8103 arm64
go version
go version go1.19.5 darwin/arm64
docker compose version
Docker Compose version v2.13.0

ディレクトリ構成

.
├── .docker
│   ├── Dockerfile
│   ├── docker-compose.yaml
│   └── .gitignore
├── cmd
│   └── app
│       └── main.go
├── internal
│   └── server
│       └── server.go
└── pkg
    └── log
        └── log.go

Dockerfile

https://github.com/takokun778/godevaircontainer/blob/main/.docker/Dockerfile

docker-compose.yaml

https://github.com/takokun778/godevaircontainer/blob/main/.docker/docker-compose.yaml

/go/pkg/をマウントして依存パッケージをキャッシュ

初回docker compose upログ
echoサーバー起動まで約29秒

2023-02-05 01:57:02 
2023-02-05 01:57:02   __    _   ___  
2023-02-05 01:57:02  / /\  | | | |_) 
2023-02-05 01:57:02 /_/--\ |_| |_| \_ , built with Go 
2023-02-05 01:57:02 
2023-02-05 01:57:02 mkdir /app/cmd/app/tmp
2023-02-05 01:57:02 watching .
2023-02-05 01:57:02 !exclude tmp
2023-02-05 01:57:02 building...
2023-02-05 01:57:02 go: downloading github.com/brpaz/echozap v1.1.3
2023-02-05 01:57:02 go: downloading github.com/labstack/echo/v4 v4.10.0
2023-02-05 01:57:02 go: downloading go.uber.org/zap v1.24.0
2023-02-05 01:57:03 go: downloading github.com/labstack/gommon v0.4.0
2023-02-05 01:57:03 go: downloading golang.org/x/crypto v0.2.0
2023-02-05 01:57:06 go: downloading golang.org/x/net v0.4.0
2023-02-05 01:57:10 go: downloading github.com/google/uuid v1.3.0
2023-02-05 01:57:10 go: downloading go.uber.org/atomic v1.7.0
2023-02-05 01:57:10 go: downloading go.uber.org/multierr v1.6.0
2023-02-05 01:57:11 go: downloading github.com/mattn/go-colorable v0.1.13
2023-02-05 01:57:11 go: downloading github.com/mattn/go-isatty v0.0.16
2023-02-05 01:57:11 go: downloading github.com/valyala/fasttemplate v1.2.2
2023-02-05 01:57:11 go: downloading golang.org/x/sys v0.3.0
2023-02-05 01:57:11 go: downloading golang.org/x/text v0.5.0
2023-02-05 01:57:20 go: downloading github.com/valyala/bytebufferpool v1.0.0
2023-02-05 01:57:31 running...
2023-02-05 01:57:31 
2023-02-05 01:57:31    ____    __
2023-02-05 01:57:31   / __/___/ /  ___
2023-02-05 01:57:31  / _// __/ _ \/ _ \
2023-02-05 01:57:31 /___/\__/_//_/\___/ v4.10.0
2023-02-05 01:57:31 High performance, minimalist Go web framework
2023-02-05 01:57:31 https://echo.labstack.com
2023-02-05 01:57:31 ____________________________________O/_______
2023-02-05 01:57:31                                     O\
2023-02-05 01:57:31 ⇨ http server started on [::]:1323

2回目以降のdocker compose upログ
echoサーバー起動まで約15秒

2023-02-05 01:58:00 
2023-02-05 01:58:00   __    _   ___  
2023-02-05 01:58:00  / /\  | | | |_) 
2023-02-05 01:58:00 /_/--\ |_| |_| \_ , built with Go 
2023-02-05 01:58:00 
2023-02-05 01:58:00 watching .
2023-02-05 01:58:00 !exclude tmp
2023-02-05 01:58:00 building...
2023-02-05 01:58:15 running...
2023-02-05 01:58:15 
2023-02-05 01:58:15    ____    __
2023-02-05 01:58:15   / __/___/ /  ___
2023-02-05 01:58:15  / _// __/ _ \/ _ \
2023-02-05 01:58:15 /___/\__/_//_/\___/ v4.10.0
2023-02-05 01:58:15 High performance, minimalist Go web framework
2023-02-05 01:58:15 https://echo.labstack.com
2023-02-05 01:58:15 ____________________________________O/_______
2023-02-05 01:58:15                                     O\
2023-02-05 01:58:15 ⇨ http server started on [::]:1323

※ .gitignoreで.docker/go/配下はGit管理から除外します。

https://github.com/takokun778/godevaircontainer/blob/main/.docker/.gitignore

注意点

volumes:
  - ./go:/go

/goでマウントしてしまうとdocker build時にインストールしたairがロストしてしまうので注意が必要です。

おわりに

なんどもdocker compose upを繰り返すようになったとき都度都度ダウンロードが走らなくなりより開発が快適になります♪

本記事で紹介のために作成したリポジトリはこちらになります。

https://github.com/takokun778/godevaircontainer

朝夜

Discussion