概要
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
何か参考になりましたら幸いです。