Docker Golang包导入错误:导入路径不以主机名开头

3

我正在测试Docker和Go项目。这是我的Dockerfile:

FROM golang

ARG app_env
ENV APP_ENV $app_env

COPY ./ /go/src/github.com/user/myProject/app
WORKDIR /go/src/github.com/user/myProject/app



RUN go get ./
RUN go build

CMD if [ ${APP_ENV} = production ]; \
then \
app; \
else \
go get github.com/pilu/fresh && \
fresh; \
fi  
EXPOSE 8080

程序本来运行良好。之后我向我的Go程序中添加了一个名为"testpack"的包。

package main

import(
"fmt"
"time"
"testpack"
)

var now = time.Now()
var election = time.Date(2016, time.November, 8, 0, 0, 0, 0, time.UTC)
func main() {
 //get duration between election date and now
tillElection := election.Sub(now)
//get duration in nanoseconds
toNanoseconds := tillElection.Nanoseconds()
//calculate hours from toNanoseconds
hours := toNanoseconds/3600000000000
remainder := toNanoseconds%3600000000000
//derive minutes from remainder of hours
minutes := remainder/60000000000
remainder = remainder%60000000000
//derive seconds from remainder of minutes
seconds := remainder/1000000000 
//calculate days and get hours left from remainder
days := hours/24
hoursLeft := hours%24

fmt.Printf("\nHow long until the 2016 U.S. Presidential election?\n\n%v Days %v Hours %v Minutes %v Seconds\n\n", days, hoursLeft, minutes, seconds)

}

现在我运行命令 => docker build ./

我遇到了一个错误

包 testpack:无法识别的导入路径“testpack”(导入路径不以主机名开头)

我尝试了这个链接 Error 'import path does not begin with hostname' when building docker with local package,但是无法解决问题

非常感谢您的帮助。


你的Dockerfile中没有添加testpack包。 - JimB
COPY ./ 应该会处理它,因为它只是主文件夹上面的一个文件夹。 - ChrisDave
1
如果testpack在应用程序目录中,则不能作为导入路径。 导入路径相对于$GOPATH/src -- 请参见如何编写Go代码 - JimB
2个回答

2
它明显试图从互联网加载它,因为它在你的GOPATH中找不到“testpack”。
你没有向我们展示你的GOPATH设置或者你复制“testpack”的位置,所以除了说“它丢失了”之外,我无法告诉你更多。
阅读https://golang.org/cmd/go/#hdr-Relative_import_paths 尝试以下操作之一:
  • import "./testpack"
  • 在你的Dockerfile中将GOPATH设置为“/go”
    import "github.com/user/myProject/app/testpack"

你好Zan,我只是在一个名为testpack的文件夹中有一个go文件。我的Gopath是 /root/work/。 - ChrisDave

0

听起来你在docker build进程中构建应用时遇到问题。这可能是一个依赖性问题(你在本地$GOPATH上安装了一个依赖项,但它没有安装在镜像的go环境中)。你可以在Dockerfile的构建命令之前安装依赖项,但我会认真考虑在Dockerfile外部构建应用,并将可执行文件复制到构建的镜像中。

Golang最大的优势之一是静态编译的可执行文件。一旦编译完成,你就可以在任何等效的架构下运行它。默认情况下,go会尝试编译静态可执行文件,但如果你想强制使用它(且你没有使用CGO做任何花哨的事情),你可以设置CGO_ENABLED环境变量为0进行构建,如下所示:CGO_ENABLED=0 go build -o <output.name> <file.to.build>

此时,你的Dockerfile变得简单得多(并且更小,请检查生成的映像的大小),类似于以下内容:

FROM scratch

#copy executable into container
ADD <output.name> <output.name>

#set entrypoint
ENTRYPOINT [./<output.name>]

#set exposed port
EXPOSE 8080

这应该解决您的依赖问题,并使您的运行时容器更小(可能小于20MB),从而减少构建时间并增加部署速度。


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