go.modを使ったDockerfileのビルド時に発生した「$GOPATH/go.mod exists but should not」エラーの回避策をメモしておきます。
<目次>
事象
以下のDockerfileをビルドしたところ、「$GOPATH/go.mod exists but should not」エラーが発生しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Dockerfile FROM golang:1.14 ENV SRC_DIR=/go/src/github.com/hoge/book-list ENV GOBIN=/go/bin ENV GO111MODULE=on COPY go.mod go.sum ./ RUN go mod download ADD ./api $SRC_DIR WORKDIR $SRC_DIR RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o $GOBIN RUN ls /go/bin ENTRYPOINT ["/go/bin/book-list"] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
## docker-compose.yml version: '3' services: api: build: context: . dockerfile: ./docker/golang/Dockerfile ports: - "8000:8000" container_name: api depends_on: - postgres environment: - POSTGRES_HOST=db - POSTGRES_USER=admin - POSTGRES_PASSWORD=admin - POSTGRES_DB=book_list |
1 2 3 |
docker-compose build api $GOPATH/go.mod exists but should not |
go.modは、Go言語の依存パッケージ管理モジュールです。
pythonの「requirements.txt」、JavaScriptの「package.json」がイメージに近いでしょうか。
go.modファイルの中身は、以下のようになっています。
1 2 3 4 5 6 7 8 |
module books-list go 1.14 require ( github.com/gorilla/mux v1.7.4 github.com/lib/pq v1.7.0 ) |
上記は、私のgolangプログラム内で使っているサードパーティモジュールのバージョンが記述されています。
go.modファイルに対して、「RUN go mod download」を実行すると依存パッケージをダウンロードしてくれます。
しかし、エラーメッセージの「$GOPATH/go.mod exists but should not」から推測するに、GOPATHが設定されている場合は、go.modが使用できないようですね。
回避策
GOPATHを設定している場合はgo modが使えないので、以下のようにGOPATHをクリアしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
FROM golang:1.14 ENV SRC_DIR=/go/src/github.com/hoge/book-list ENV GOBIN=/go/bin ENV GO111MODULE=on ENV GOPATH= # GOPATHクリア COPY go.mod go.sum ./ RUN go mod download ADD ./api $SRC_DIR WORKDIR $SRC_DIR RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-w -s" -o $GOBIN RUN ls /go/bin ENTRYPOINT ["/go/bin/book-list"] |
1 2 3 |
docker-compose build api Successfully tagged book-list_api:latest |
無事にビルドが成功しました!
おわりに
GOPATHをクリアすることで無事にビルドすることが可能になりましたが、GOPATHが設定されているとビルドに失敗する理由についてはまだ理解できてません^^;
この辺りの勉強を深掘りしていきたいと思います。
それでは、また!
コメントを残す
コメントを投稿するにはログインしてください。