LoginSignup
3
3

More than 3 years have passed since last update.

Go を docker で動かす時の tips

Posted at

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 エラー

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 run した時に exec user process caused "no such file or directory" と怒られる

  • 最近の Go のバイナリは Dynamic link を行うらしく、これはそのリンク対象が存在しないために発生しているらしい
  • ビルド時に CGO_ENABLED=0 をつけるといける
    • CGO_ENABLED=0 go build
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3