如何使用main.go在文件夹内使用本地包构建docker镜像?

Mit*_*tch 5 go docker docker-build

我正在尝试docker build -t test_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"]
Run Code Online (Sandbox Code Playgroud)

main.go(路径:gowork / src / docker_test / main.go)

package main

import (
    "docker_test/mult"
    "fmt"
)

func main() {
    fmt.Println("From different pkg")
    mult.Multiple()
}
Run Code Online (Sandbox Code Playgroud)

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)

}
Run Code Online (Sandbox Code Playgroud)

Abd*_*hin 6

go get试图找到包docker_test/mult/go路径。但是,您已复制到/go/src/app. 这就是为什么go get无法在本地找到该包并假设该包来自远程存储库(例如 github)并引发错误的原因import path does not begin with hostname。所以复制docker_test/mult里面的/go路径。

另一个问题是,当您使用 时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"]
Run Code Online (Sandbox Code Playgroud)