はじめに
最近Golangの学習を始めました。ざっとA Tour of Goを一通りやったので、実際に何かを書いてみようと思い、Go+Gin+Gorm+Mysql+Docker+Nginxで簡単なAPIを作成しようとしていました。そんな時に下記のようなエラーに遭遇したので、備忘録がてら記事にします。
実行手順とエラーの内容
さて、簡単なREST APIを作成するために、Dockerで環境を構築しようと下記のように最小構成でDockerfileを記載しました。
FROM golang:1.20.0-bullseye
WORKDIR /data
RUN apt-get update \
&& apt-get install git \
&& go get github.com/gin-gonic/gin \
&& go get github.com/jinzhu/gorm \
&& go get github.com/go-sql-driver/mysql
早速コマンドを叩いてビルドしようとすると、
$ docker compose build
下記のようなエラーに遭遇しました。
// (省略)
go: go.mod file not found in current directory or any parent directory.
'go get' is no longer supported outside a module.
To build and install a command, use 'go install' with a version,
like 'go install example.com/cmd@latest'
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.
こちらを翻訳すると、
go.mod ファイルが現在のディレクトリまたは親ディレクトリに見つかりませんでした。コマンドをビルドしてインストールするには、'go install example.com/cmd@latest' のように、バージョンを指定して 'go install' を使ってください。詳細については、https://golang.org/doc/go-get-install-deprecation を参照するか、 'go help get' または 'go help install' を実行してください。
とのこと。
つまり、本エラーはgo.mod
ファイルがなかったことが原因でした。(多分ものすごーく初歩的な躓き・・・)
解決策 : Dockerfileにgo.modファイルを作成する処理を追記する
先ほど原因だと判明した「go.mod
ファイルがないこと」に対して、アプローチをしていきます。解決策は単純で、下記のようにDockerfileに対して、go.modのファイルを追加するコマンドgo mod init <プロジェクト名>
を追記します。
FROM golang:1.20.0-bullseye
WORKDIR /data
+ RUN go mod init web-service-gin
+ RUN go mod tidy
RUN apt-get update \
&& apt-get install git \
&& go get github.com/gin-gonic/gin \
&& go get github.com/jinzhu/gorm \
&& go get github.com/go-sql-driver/mysql
これを実行すると、
// (省略)
[+] Running 3/3
⠿ Container web-service-gin-web-1 Running 0.0s
⠿ Container web-service-gin-db-1 Running 0.0s
⠿ Container web-service-gin-app-1 Running 0.0s
となり、上手くコンテナが立ち上がりましたね。
※ コンテナはGolang(App)、Nginx(Web)、Mysql(Db)の3つを立ち上げています
go.modファイルについては下記サイトに詳しく記載があったので、よければご覧ください。
おわりに
「go.mod file not found in current directory or any parent directory.」の対処法は以上です。サーバーサイドでは初めてPHP以外の言語を扱っているので(新卒の会社でC言語は研修で触りましたが)、超初歩的な内容となっています。
今後は業務でずっとPHP(Laravel)を触ってきて、現在Golangの学習をしている人に向けて、それぞれを比較しながら記事を書けたらいいなあと何となく思っています。
何かご指摘等あればコメントいただけると嬉しいです。