Closed18

Go+Dockerでいい感じの開発環境を作りたい

ksaitoksaito

目標

  • Go+MySQLな環境を実現すること
  • ホットリロードしたい
  • 本番用バイナリ生成もしたい
ksaitoksaito

composeでgoを立ち上げるところまでできた。

でもソース変更してもコンテナ再起動しないと変更が反映されない
ホットリロード必要か・・

ksaitoksaito

一応起動した時の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の処理が走る

コンテナ名わかりづらいな・・

ksaitoksaito

あとは本番環境用に余計なものを省いた軽量なimage作るだけ

ksaitoksaito

いい感じにで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 --from=builder /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"]
ksaitoksaito

これでホットリロードの開発環境を起動する

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 

https://miuuuu.hatenablog.com/entry/2020/03/22/162221
https://qiita.com/yagince/items/33a7e4d1818cb7b9648e

ksaitoksaito

最後にそれぞれ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

https://knowledge.sakura.ad.jp/16082/#Docker-3

ksaitoksaito

疎通確認


>>> curl localhost:8000                                                                                          
Hello world!                                                                                                             
>>> curl localhost:8080                                                                                           
Hello world!

// この間でmain.goを編集する

>>> curl localhost:8000                                                                                           
Hello world!!!!!                                                                                                          
>>> curl localhost:8080                                                                                           
Hello world!    
ksaitoksaito

ホットリロードと本番で共存できていて、よき

ksaitoksaito

それぞれのイメージサイズを確認する

>>> 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
ksaitoksaito

1.01GBと14.8MBといい感じに軽量化できたのではないか

このスクラップは2022/08/28にクローズされました