如何用 main.go 文件夹内的本地包构建 docker 图像?

How to build docker image with local package inside folder with main.go?

我正在尝试 docker build -t test_1 。 ,但有这个错误:

package docker_test/mult: unrecognized import path "docker_test/mult" (import path does not begin with hostname)

The command '/bin/sh -c go get -d -v ./...' returned a non-zero code: 1

我的docker文件(路径/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)

}

go get 试图在 /go 路径中找到包 docker_test/mult。但是,您已复制到 /go/src/app。这就是为什么 go get 无法在本地找到包并假定包来自远程存储库,例如 github,并抛出错误 import path does not begin with hostname。所以在 /go 路径中复制 docker_test/mult

另一个问题是,当您使用 WORKDIR go/src/app 时,它会在 /go 路径中创建 go/src/app,因此最终路径变为 /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,所以你应该可以构建它

Docker 文件

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"]