Golang在Docker中构建时找不到本地导入包

4

我对GoLang还比较陌生。我有一个非常简单的dockerFile,试图构建一个GoLang Web服务。

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

我遇到的错误是:

包webservice_refArch/restapi:未识别的导入路径“webservice_refArch/restapi”(导入路径不以主机名开头)

当我在本地(同一文件夹中)运行相同的命令时,它可以顺利运行。我确信我缺少一些愚蠢的东西,但是否有任何思路为什么在运行docker时会失败呢?

1
使用正确的导入路径。不要与工具对抗。 - Jonathan Hall
谢谢Flimzy。我不知道我是否理解了这个评论。我肯定不想“与工具作斗争”,但我可能不明白我是如何/为什么这样做的。本地导入正在拉取与同一GitHub存储库中的包。如果我将它们放在单独的GitHub存储库中,那么在构建之前需要进行多次提交到GitHub。这似乎是一种糟糕的开发体验。请问您能详细说明一下您的评论吗? - mornindew
3个回答

3
缺少的是将您的项目放置在$GOPATH下,如果您有本地命名空间,它也应该在同一命名空间$GOPATH/domain.com/下。
另外一个正确的方法是使用多阶段构建。多阶段构建涉及调用临时容器来促进应用程序构建,然后将构建的资产从该空间复制到具有运行应用程序所需最少组件的容器映像中。
# 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}

这太棒了,非常感谢。我会试一试的。这看起来相当不错。 - mornindew

1

这并不是很好,但如果您在最初的几次尝试中遇到困难,可以仅复制可执行文件,类似于以下操作:

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

在镜像内部编译代码肯定更好,但并非必须。因此,您可以在本地编译代码,然后仅移动可执行文件,这样您就不会再遇到类似的问题了。


0

这是因为我没有复制到我的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接