【问题标题】:How to build docker image with local package inside folder with main.go?如何使用 main.go 文件夹内的本地包构建 docker 映像?
【发布时间】:2018-09-29 13:31:44
【问题描述】:

我正在尝试 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"]

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)

}

【问题讨论】:

  • 您可以尝试将您的第一个副本更改为COPY ./docker_test /go/src/docker_test,如果它有效,那么我将在我的回答中解释它为什么有效。
  • 现在错误是:go install: no install location for directory /go/go/src/app outside GOPATH For more details see: 'go help gopath' The command '/bin/sh -c go install -v ./...' returned a non-zero code: 1

标签: docker go docker-build


【解决方案1】:

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 路径中创建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"]

【讨论】:

  • 行得通,谢谢!你能解释为什么..?我的意思是,我认为这样 (COPY ./docker_test /go/src/docker_test) 我复制了所有文件,包括 docker_test 中的 main.go...
  • @Mitch。当您尝试时,我仍在添加一些概念。 :) 我现在添加了解释。这些变化有意义吗?
  • 是的,更清楚了,谢谢,但仍然不明白为什么在复制 ./docker_test /go/src/docker_test 并复制 main.go 之后我没有 2 个 main.go 文件项目(
  • @Mitch,这很好。是的,/go/src/docker_test 内会有一个额外的 main.go 文件,但它不会产生问题,因为该文件不属于任何项目目录 (workdir) 或依赖文件夹。虽然,它不应该被复制。我忽略了它。第一个副本应该是 COPY ./docker_test/mult /go/src/docker_test/mult
  • Dockerfile 需要位于您尝试Copy 的文件的父文件夹中。但是,可以将 dockerfile 保存在单独的文件夹中。在这种情况下,您的指针需要位于文件的任何父文件夹中,然后为 docker 文件位置提供 file 标志。因此,在您的情况下,您可以从 src 文件夹运行以下命令:docker build -t example-tag . -f builder/Dockerfile
【解决方案2】:

确保您设置了 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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多