Closed18
Go+Dockerでいい感じの開発環境を作りたい
目標
- Go+MySQLな環境を実現すること
- ホットリロードしたい
- 本番用バイナリ生成もしたい
参考にして、Go+MySQLの環境をひとまず作る。
composeでgoを立ち上げるところまでできた。
でもソース変更してもコンテナ再起動しないと変更が反映されない
ホットリロード必要か・・
ひとまず、上の記事通りでdriverやdbconfigを気をつけたら、mysqlコンテナの起動確認できた。
goからのpingも問題なし。
ここまでの作業ログ
ホットリロードは、airというものが主流なようなのでそちらを入れることにする
realizeというのもあるけど、2020年からメンテされていない模様
ここら辺を参考にair導入した
ここまでの作業ログ
一応起動した時のairのログ出力
>>> docker compose up
[+] Running 2/0
⠿ Container go-backend-db Created 0.0s
⠿ Container db-backend-go Created 0.0s
Attaching to db-backend-go, go-backend-db
go-backend-db |
go-backend-db | __ _ ___
go-backend-db | / /\ | | | |_)
go-backend-db | /_/--\ |_| |_| \_ , built with Go
go-backend-db |
db-backend-go | 2022-08-28 16:09:45+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.
go-backend-db | mkdir /go/src/app/tmp
go-backend-db | watching .
go-backend-db | watching cmd
go-backend-db | !exclude docker
go-backend-db | watching pkg
go-backend-db | !exclude tmp
go-backend-db | building...
go-backend-db | go: downloading github.com/go-sql-driver/mysql v1.6.0
db-backend-go | 2022-08-28 16:09:46+09:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
db-backend-go | 2022-08-28 16:09:46+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.21-1debian10 started.
db-backend-go | 2022-08-28T16:09:46.524005+09:00 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.21) starting as process 1
db-backend-go | 2022-08-28T16:09:46.530776+09:00 0 [Warning] [MY-010159] [Server] Setting lower_case_table_names=2 because file system for /var/lib/mysql/ is case insensitive
db-backend-go | 2022-08-28T16:09:46.542876+09:00 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
db-backend-go | 2022-08-28T16:09:47.138313+09:00 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
db-backend-go | 2022-08-28T16:09:47.298384+09:00 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
db-backend-go | 2022-08-28T16:09:47.418238+09:00 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
db-backend-go | 2022-08-28T16:09:47.418735+09:00 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
db-backend-go | 2022-08-28T16:09:47.435979+09:00 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
db-backend-go | 2022-08-28T16:09:47.547375+09:00 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.21' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
go-backend-db | running...
go-backend-db | cmd/main.go has changed
go-backend-db | building...
go-backend-db | running...
go-backend-db | cmd/main.go has changed
go-backend-db | building...
go-backend-db | running...
main.goなど編集したら、buildingしてrunningの処理が走る
コンテナ名わかりづらいな・・
あとは本番環境用に余計なものを省いた軽量なimage作るだけ
いい感じにでdockerfileできたか
といってもほぼ参考記事からのコピーに近いが・・
########################################
# prod build
########################################
FROM golang:1.19.0-alpine AS builder
WORKDIR /go/src/app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
+ RUN go build -o main ./cmd/main.go
+
+ ########################################
+ # production image
+ ########################################
+ FROM alpine:3.16 AS production
+
+ WORKDIR /app
+ RUN apk update
+
+ # 実行に必要なバイナリをコピー
+ COPY /go/src/app/main .
+
+ EXPOSE 8080
+
+ CMD ["./main"]
########################################
# Local environment
########################################
FROM golang:1.19.0 AS develop
WORKDIR /go/src/app
RUN go install github.com/cosmtrek/air@latest
CMD ["air", "-c", ".air.toml"]
これでホットリロードの開発環境を起動する
docker compose build --no-cache
docker compose up
>>> dcps
NAME COMMAND SERVICE STATUS PORTS
db-backend-go "docker-entrypoint.s…" db running (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp
go-backend-db "air -c .air.toml" backend running 0.0.0.0:8000->8000/tcp
次に本番環境用のイメージをターゲット指定してbuildする
プロジェクトのルートでコマンド入力するから、-fでdockerfileのpathを指定する。
>>> docker build --target production -t go-app:latest . -f docker/backend/Dockerfile
最後にそれぞれport8000と8080使っていて、dbとのコネクションが必要がだから、composeのネットワーク使って、それぞれを起動してみる。
>>> docker network ls
NETWORK ID NAME DRIVER SCOPE
9026d3884358 go-mysql-dev_default bridge local
>>> docker run --rm --network go-mysql-dev_default -p 8080:8000 go-app:latest
疎通確認
>>> curl localhost:8000
Hello world!
>>> curl localhost:8080
Hello world!
// この間でmain.goを編集する
>>> curl localhost:8000
Hello world!!!!!
>>> curl localhost:8080
Hello world!
ホットリロードと本番で共存できていて、よき
それぞれのイメージサイズを確認する
>>> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
go-app latest 3a25c0f6649f 14 minutes ago 14.8MB
go-mysql-dev_backend latest 0a5a094ea3b0 About an hour ago 1.01GB
1.01GBと14.8MBといい感じに軽量化できたのではないか
本題とは関係ないが、dbコンテナ起動前にappコンテナが起動してしまってアプリが落ちるから、depends_on
とservice_healthy
で依存関係追加した
やりたいことできたからclose
このスクラップは2022/08/28にクローズされました