私の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
コマンドをログに記録できますか?
すべてのファイルをイメージのルートディレクトリにコピーしています。依存関係をインストールしていません。ビルドしてから、/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"]
これは次のことを行います。
/go/src/myapp
にコピーします。/go/src/myapp
に設定します。ls
またはdocker exec
を使用して他のコマンドを実行できます。
例:
docker exec <image name/hash> ls
生成された画像にシェルを入力して、それを使用して理解することもできます
docker run --rm -it <image hash/name> /bin/sh
実験後、私はこの方法で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"]
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"]
myapp
は、推奨どおり/go/src/myapp
または/usr/local/go/src/myapp
にある必要があります。 ADD
セクションに追加できます。
公式ドキュメントは次の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 をご覧ください。
単にバイナリを実行するコンテナを作成することが目的の場合は、別の方法をとります。
最初にLinux用のバイナリをビルドします。
GOOS=linux CGO_ENABLED=0 go build -a -installsuffix cgo
次に、軽量のDockerイメージを最初から作成します。
FROM scratch
COPY myApp
CMD ["/myApp"]