docker image
go mod を利用するパターンの参考
# buildイメージ
FROM golang:1.13 AS builder
WORKDIR /go/src
## 依存ライブラリをダウンロードする(キャッシュを使いたいので、これを先にやる)
ENV GO111MODULE=on
COPY go.mod go.sum ./
RUN go mod download
ADD . /myapp
WORKDIR /myapp
## main.goをコンパイルし、実行バイナリを保存
RUN CGO_ENABLED=0 GOOS=linux go build -o server ../myapp/cmd/main.go
# run-timeイメージ
FROM alpine:3.10
COPY --from=builder /myapp/server /app
EXPOSE 50051
ENTRYPOINT ["/app"]
dep を利用するパターンの参考
# buildイメージ
FROM golang:1.13 AS builder
ADD . /go/src/github.com/myself/myapp
WORKDIR /go/src/github.com/myself/myapp
## depのインストール と依存関係の解決
RUN go get github.com/golang/dep/cmd/dep
RUN dep ensure
## main.goをコンパイルし、実行バイナリを保存
RUN CGO_ENABLED=0 GOOS=linux go build -o server /myapp/cmd/main.go
# run-timeイメージ
FROM alpine:3.10
COPY --from=builder /go/src/github.com/myself/myapp/server /app
EXPOSE 50051
ENTRYPOINT ["/app"]
詰まったポイント
go buildで cannot find package
エラー
- パスが間違っているか、ファイルがないかどっちかの可能性が高い
go build で packages founded A and B
エラー
- 同一ディレクトリの中に複数個のパッケージがある
- 以下はコンパイルエラー
- 対象ディレクトリ配下に複数のmainパッケージのモジュールを置く
- 異なる名前のパッケージ宣言を持つモジュールを同じディレクトリの中に置く
- 末尾が
_test
で終わるファイルはテストコードとして解釈されるので例外的に複数個目として配置できる
- ちなみに、ディレクトリと異なる名前でパッケージ宣言するのはセーフ
- パッケージ名ではなくパスベースで import するから
go getで、XX is not using a known version control system
エラー
- https://github.com/gobuffalo/buffalo/issues/694#issuecomment-337032375
- 上記を元に
/vendor
以下の対象のファイル群を消したらなぜかうまくいった
dep ensure で /hoge is not within a known GOPATH/src
エラー
- よくわからんがディレクトリ構成がダメっぽい
- Goのディレクトリ構成の特徴として、すべてのソースコードを環境変数
$GOPATH/src
配下に置く - 解決法は以下の二つ
- コンテナ内の
/go/src
以下にリポジトリを配置する - シンボリックリンクを貼る
- コンテナ内の
dep ensure で root project import: dep does not currently support using GOPATH/src as the project root
エラー
- workdir を
GOPATH/src
に指定していたところをGOPATH/src/app
にしたら直った
docker build 時の dep ensure で fatal: could not read Username for 'https://github.com'~
みたいに、githubにアクセスできなくて怒られる
- private リポジトリから資源を取る時は github token などを使わないとダメ
- ただ、自分のリポジトリの資源を取る時はローカルパスでいけるはず。それが取れない場合はパスが間違っている可能性大
- 実際、docker の workdir を
go/src/app
から/go/src/github.com/myself/my-app
にしたらいけた
- 実際、docker の workdir を
docker run した時に exec user process caused "no such file or directory"
と怒られる
- 最近の Go のバイナリは Dynamic link を行うらしく、これはそのリンク対象が存在しないために発生しているらしい
- ビルド時に
CGO_ENABLED=0
をつけるといけるCGO_ENABLED=0 go build