目的
go-ginで開発しているときにFargateに無理やりマイグレーション&シードを行いたかった感じです。
ただlayerが多すぎて肥大化しているので、あまりおすすめしません。
本当はfargateで新しいタスク立てたり、code pipeline使うべきなんでしょうけど、急いでいるのでこれで。
ファイル
以下fargateにデプロイするようのDockerfileです。
migrationとseedディレクトリにmain.goが入っているのでそれをbuildしてalpineのほうのイメージに移動させます。
FROM golang:latest as builder
ENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
COPY . /go/src/backend
WORKDIR /go/src/backend
RUN go get github.com/line/line-bot-sdk-go/linebot && \
go get github.com/joho/godotenv && \
go get -u gorm.io/gorm && \
go get gorm.io/driver/mysql && \
go get github.com/golang-migrate/migrate && \
go get github.com/golang-migrate/migrate/database/mysql && \
go get github.com/golang-migrate/migrate/source/file && \
go get github.com/pkg/errors && \
GOOS=linux GOARCH=amd64 go build -o /main
WORKDIR /go/src/backend/migration
RUN go get github.com/go-sql-driver/mysql@v1.6.0 && \
GOOS=linux GOARCH=amd64 go build -o /go/src/backend/migration/main
WORKDIR /go/src/backend/seed
RUN GOOS=linux GOARCH=amd64 go build -o /go/src/backend/seed/main
# runtime image
FROM alpine
RUN apk update \
&& apk add --no-cache git curl make gcc g++
COPY --from=builder /main .
COPY --from=builder /go/src/backend/migration ./migration
COPY --from=builder /go/src/backend/seed ./seed
COPY ./entrypoint.sh .
RUN ["chmod", "u+x", "./entrypoint.sh"]
ENV PORT=${PORT}
ENTRYPOINT ["./entrypoint.sh"]
entrypoint.sh
は以下です。
ステージングなので、まずデータベースのマイグレーションをすべてドロップします。そのあとマイグレーションをおこなって、シーディングして最後にサーバーのコードを走らせる感じです。
entrypoint.sh
#!/bin/sh
/migration/main drop
/migration/main up
/seed/main seed
/main