🐙

Go×SQLiteをdockerで動かす

2023/04/03に公開

はじめに

GoとSQliteを使った簡単なアプリケーションをdockerを用いて作成しDeployするところまでを解説します。

実行環境

PC m2 MacBookAir
OS MacOS13.2.1
Docker Desktop 4.17.0

アプリ構成

main.goとsqlite.dbだけで構成された簡単なアプリを例とします。
├── go.mod
├── go.sum
├── main.go
└── sqlite.db

SQlite

SQLiteは軽量なRDBで面倒なインストールなどが不要です。また、クラウドのRDBMSは高額ですが、SQLiteを使うことで、手軽にRDBを使うことができます。

SQLite Driver

GoではSQLite Driverがいくつか提供されています。SQLiteはC言語で実装されておりGoの多くのDriverはcgoを用いています。Driverは好きなものを使えば大丈夫です。

Dockerfile

Goは単一バイナリファイルで実行できるという強みがあります。Binaryファイルが実行できる小さいDockerimageを作成することで、Deployフローの高速化などにつながります。

multi-stage-build

multi-stage-buildを用いることで、buildで使用する環境と実行で使用する環境を分けることができます。この機能を使用することでDockerimageを小さくすることができます。

SQLiteを使う上での注意

Docker内で RUN apk add --no-cache git sqlite-dev gcc musl-devというコマンドでsqlite関連やgccを入れています。これをしないと、SQLiteを呼び出すことができないので注意してください。

Dokcerfile

# build環境
FROM golang:1.20.2-alpine as builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download
RUN apk add --no-cache git sqlite-dev gcc musl-dev

COPY . .
RUN go build -o main .

# 実行環境
FROM alpine
RUN apk update && apk upgrade
RUN mkdir /app
WORKDIR /app

COPY --from=builder /app/main ./main
COPY ./sqlite.db ./sqlite.db

CMD ["./main"]

build

dockerをbuildします

$ docker build -t ${{tag}} .

起動

$ docker start [OPTIONS] CONTAINER [CONTAINER...]

Discussion