web-dev-qa-db-ja.com

GoアプリでDockerをビルドする:パッケージが見つかりません

私のDockerfileは、ディレクトリのルートにsrc/myappフォルダがあり、myappにはmyapp.goがメインパッケージとともに含まれています。

Dockerfileは次のようになります。

FROM golang:1.9.2

ADD . /
RUN go build myapp;

ENTRYPOINT ["/go/bin/myapp"]

次のエラーが発生します。

can't load package: package myapp: cannot find package "myapp" in any of:
    /usr/local/go/src/myapp (from $GOROOT)
    /go/src/myapp (from $GOPATH)

何が悪いのですか? dockerがlsを実行した後にADDコマンドをログに記録できますか?

9
Rudziankoŭ

すべてのファイルをイメージのルートディレクトリにコピーしています。依存関係をインストールしていません。ビルドしてから、/go/bin/appからバイナリを実行しています。バイナリがそのディレクトリに存在せず、エラーが発生しています。

このようなDockerfileを使用することをお勧めします。

FROM golang:1.9.2 
ADD . /go/src/myapp
WORKDIR /go/src/myapp
RUN go get myapp
RUN go install
ENTRYPOINT ["/go/bin/myapp"]

これは次のことを行います。

  1. プロジェクトファイルを/go/src/myappにコピーします。
  2. 作業ディレクトリを/go/src/myappに設定します。
  3. 依存関係をインストールします。私はgo getを使用しましたが、使用している依存関係管理ツールで置き換えてください。
  4. バイナリをインストール/ビルドします。
  5. エントリポイントを設定します。

lsまたはdocker execを使用して他のコマンドを実行できます。

例:

docker exec <image name/hash> ls

生成された画像にシェルを入力して、それを使用して理解することもできます

docker run --rm -it <image hash/name> /bin/sh
5
Ishan Jain

実験後、私はこの方法でGolangアプリを構築しました。

この方法にはいくつかの利点があります。

  • 依存関係はビルド段階でインストールされます

  • 必要に応じて、テストオプションのコメントを外してください。

  • 約800 MBの最初の完全に機能するイメージを作成する

  • プログラムを新しい空のイメージにコピーし、約10 MBの非常に小さなイメージを生成します

Dockerfile

# Two-stage build:
#    first  FROM prepares a binary file in full environment ~780MB
#    second FROM takes only binary file ~10MB

FROM golang:1.9 AS builder

RUN go version

COPY . "/go/src/github.com/your-login/your-project"
WORKDIR "/go/src/github.com/your-login/your-project"

#RUN go get -v -t  .
RUN set -x && \
    #go get github.com/2tvenom/go-test-teamcity && \  
    go get github.com/golang/dep/cmd/dep && \
    dep ensure -v

RUN CGO_ENABLED=0 GOOS=linux GOARCH=AMD64 go build  -o /your-app

CMD ["/your-app"]

EXPOSE 8000



#########
# second stage to obtain a very small image
FROM scratch

COPY --from=builder /your-app .

EXPOSE 8000

CMD ["/your-app"]
7
Eugene Lisitsky

Go 1.11の場合、goモジュールを使用できます。以下は例です

FROM Alpine AS base
RUN apk add --no-cache curl wget

FROM golang:1.11 AS go-builder
WORKDIR /go/app
COPY . /go/app
RUN GO111MODULE=on  CGO_ENABLED=0 GOOS=linux GOARCH=AMD64 go build -o /go/app/main /go/app/cmd/myapp/main.go

FROM base
COPY --from=go-builder /go/app/main /main
CMD ["/main"]
4
howie

myappは、推奨どおり/go/src/myappまたは/usr/local/go/src/myappにある必要があります。 ADDセクションに追加できます。

0
samthegolden

公式ドキュメントは次のDockerfileを提案しています:

FROM golang:1.8

WORKDIR /go/src/app
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]

詳細は https://hub.docker.com/_/golang をご覧ください。

0
nrm97

単にバイナリを実行するコンテナを作成することが目的の場合は、別の方法をとります。

最初にLinux用のバイナリをビルドします。

GOOS=linux CGO_ENABLED=0 go build -a -installsuffix cgo

次に、軽量のDockerイメージを最初から作成します。

FROM scratch
COPY myApp 
CMD ["/myApp"]
0
PassKit