web-dev-qa-db-ja.com

main.goを使用してフォルダー内のローカルパッケージを使用してDockerイメージを構築するにはどうすればよいですか?

Docker build -ttest_1を試しています。 、しかし、このエラーがあります:

パッケージdocker_test/MULT:認識されていないインポートパス「docker_test/MULT」(ホスト名で始まっていないインポートパス)

コマンド '/ bin/sh -c go get -d -v。/ ...'はゼロ以外のコードを返しました:1

私のdockerfile(パス/ gowork/src/Dockerfile):

FROM golang:1.9.1
COPY ./docker_test/mult /go/src/app

WORKDIR go/src/app
COPY ./docker_test/main.go .

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

CMD ["app"]
ENTRYPOINT ["app", "-f=7", "-s=9"]

main.go(パス:gowork/src/docker_test/main.go)

package main

import (
    "docker_test/mult"
    "fmt"
)

func main() {
    fmt.Println("From different pkg")
    mult.Multiple()
}

mult.go(パス:gowork/src/docker_test/mult/mult.go)

package mult

import (
    "flag"
    "fmt"
)

func Multiple() {

    first := flag.Int("f", 0, "placeholder")
    second := flag.Int("s", 0, "placeholder")

    flag.Parse()

    out := (*first) * (*second)
    fmt.Println(out)

}
6
Mitch

go getパッケージdocker_test/mult/goパスに見つけようとしています。しかし、あなたは/go/src/appにコピーしました。そのため、go getはパッケージをローカルで見つけることができず、パッケージがgithubなどのリモートリポジトリからのものであると想定し、エラーimport path does not begin with hostnameをスローします。したがって、docker_test/multパス内の/goをコピーします。

もう1つの懸念は、WORKDIR go/src/appを使用すると、go/src/appパス内に/goが作成されるため、最終的にパスが/go/go/src/appになることです。したがって、絶対パス、つまりWORKDIR /go/src/appを使用します。

これを試してくださいdockerfile

FROM golang:1.9.1
COPY ./docker_test/mult /go/src/docker_test/mult

WORKDIR /go/src/app
COPY ./docker_test/main.go .

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

CMD ["app"]
ENTRYPOINT ["app", "-f=7", "-s=9"]

必ずGOPATHを設定してください。この例では、インポートでdocker_test/multを使用しているため、コンパイラーがそれを解決するには、GOPATH/docker_test/multに配置します。

私はあなたのDockerfileを微調整したので、あなたはそれを膨らませることができるはずです

Dockerfile

FROM golang:1.9.1

ENV GOPATH /go

FROM golang:1.9.1
COPY ./docker_test /go/src/docker_test
COPY ./docker_test/main.go /go/src/app/main.go

WORKDIR /go/src/app

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


CMD ["app"]
ENTRYPOINT ["app", "-f=7", "-s=9"]
1
Adrian