概要
docker-compose
を用いた複数コンテナを利用していました。
このうちの1つがgolangで作成したapiだったのですが、このapiにgo modules
を導入しようとして少しハマったので解決策を共有します。
そもそもgo moduleとは
一応前提の話をしますと、go modules
を使うことによって$GOPATH
を気にすることなくpackageをimportすることができるようになります。
package main
だけで完結している軽いアプリケーションなら不要ですが、packageを分割したい際にはgo module
を導入するといいかもしれません。
スタック
フォルダ構成
article
├ client
├ api
│ ├ main.go
│ ├ // 省略
│ ├ go.mod
│ ├ go.sum
│ └ Dockerfile
├ nginx
└ docker-compose.yml
go.mod
module article/api
- apiディレクトリ上で
go mod init article/api
を叩いてgo.mod
を作成しています。
Dockerfile
apiディレクトリ以下のDocekrfileは以下のようになります
Dockerfile
FROM golang:latest
ENV GO111MODULE=on
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
ENTRYPOINT ["/app/api"]
docker-compose.yml
最後にdocker-compose.ymlは以下のようになります
docker-compose.yml
version: '3'
services:
api:
build:
dockerfile: Dockerfile
context: ./api
volumes:
- ./api:/go/src/github.com/jpskgc/article/app
depends_on:
- db
tty: true
environment:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- MYSQL_USER
- MYSQL_PASSWORD
- MYSQL_HOST
- GO111MODULE
//他コンテナの記述は省略
Docekrfile
とdocker-compose.yml
の設定がうまくいかなくて悪戦苦闘していた記憶があります。
一応このサンプルの全ソースコードは以下にあります
https://github.com/jpskgc/article
何か参考になりましたら幸いです。