【问题标题】:Golang Build in docker not finding local importGolang Build in docker没有找到本地导入
【发布时间】:2018-12-15 14:49:48
【问题描述】:

我对 GoLang 还是很陌生。我有一个非常简单的 dockerFile,它正在尝试构建一个 goLang 网络服务。

FROM golang:alpine

WORKDIR /app/webservice_refArch
ADD . /app/webservice_refArch

RUN apk add git
RUN apk upgrade

RUN cd /app/webservice_refArch/ && go get webservice_refArch/restapi
RUN cd /app/webservice_refArch/cmd/reference-w-s-server && go build -o ../../server
ENTRYPOINT ./goapp

构建运行时找不到本地导入。

go get webservice_refArch/restapi

我得到的错误是:

package webservice_refArch/restapi: 无法识别的导入路径 “webservice_refArch/restapi”(导入路径不以 主机名)

当我在本地(在同一个文件夹中)运行相同的命令时,它运行得很好。我确信我遗漏了一些愚蠢的东西,但是任何关于从 docker 运行时为什么会失败的想法都将不胜感激。

【问题讨论】:

  • 使用正确的导入路径。不要与工具作斗争。
  • 谢谢 Flimzy。我不知道我是否理解评论。我当然不想“与工具作斗争”,但我可能不明白我是如何/为什么。本地导入正在拉入同一 github 存储库中的包。如果我将它们放在单独的 github 存储库中,那么在构建之前将需要多次提交到 github。这似乎是一种糟糕的开发体验。你能详细说明你的评论吗?

标签: docker go dockerfile


【解决方案1】:

这是因为我没有复制到我的 GOROOT 位置。结果,当它试图查找本地资源时,它不在 GOROOT 位置。

更改 dockerFile 使其看起来像这样工作...

FROM golang:alpine

WORKDIR /go
ADD . /go/src/webservice_refArch

RUN apk add git
RUN apk upgrade

RUN cd /go/src/webservice_refArch/ && go get ./...
RUN cd /go/src/webservice_refArch/cmd/reference-w-s-server && go build -o ../../server
ENTRYPOINT ./goapp

【讨论】:

    【解决方案2】:

    缺少的是将您的项目放在$GOPATH 下,如果您有本地命名空间,它也应该在同一命名空间$GOPATH/domain.com/ 下。

    实现这一点的正确方法是进行多阶段构建。 Multi-stage 的基本原理是调用一个可以促进应用程序构建的临时容器,然后将构建的资产从该空间复制到具有运行应用程序所需组件最少的容器映像中。

    # builder
    FROM golang:1-alpine AS builder
    RUN apk add git ca-certificates --update
    
    ENV SERVICE_NAME my_project
    ENV NAMESPACE mydomain #if you don't use namespace space just ignore it and remove it from the following lines
    ENV APP /src/${NAMESPACE}/${SERVICE_NAME}/
    ENV WORKDIR ${GOPATH}${APP}
    
    WORKDIR $WORKDIR
    ADD . $WORKDIR
    
    RUN go build
    
    ###############################################################
    
    #image
    FROM alpine
    RUN apk add ca-certificates --update
    
    ENV SERVICE_NAME webservice_refArch
    ENV NAMESPACE my_domain #if you don't use namespace space just ignore it and remove it from the following lines
    ENV APP /src/${NAMESPACE}/${SERVICE_NAME}/
    ENV GOPATH /go
    ENV WORKDIR ${GOPATH}${APP}
    
    COPY --from=builder ${WORKDIR}${SERVICE_NAME} $WORKDIR
    
    CMD ${WORKDIR}${SERVICE_NAME}
    

    【讨论】:

    • 这太棒了,非常感谢。我会试一试。这看起来很漂亮
    【解决方案3】:

    这肯定不是很好,但如果你第一次遇到困难,你可以只复制可执行文件,这样做:

    FROM golang:alpine
    RUN apk upgrade
    COPY goapp .
    CMD ./goapp
    

    在图像内部编译代码肯定更好,但这不是必需的。所以你可以在本地编译你的代码,然后只移动可执行文件,你就不会再遇到这样的问题了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2022-01-08
      • 2021-12-12
      • 1970-01-01
      相关资源
      最近更新 更多