2017-09-13 96 views
1

我想测试码头并去项目。这是我的码头文件泊坞窗golang包导入错误:导入路径不以主机名开头

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) 

} 

现在我跑=>泊坞窗构建./

我得到一个错误

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

我试过Error 'import path does not begin with hostname' when building docker with local package但无法解决

任何帮助表示赞赏。

+0

您的dockerfile中无处添加testpack软件包。 – JimB

+0

COPY ./应该照顾它,因为它只是主文件夹上方的一个文件夹 – ChrisDave

+0

如果'testpack'位于应用程序目录中,则不能作为导入路径。导入路径相对于'$ GOPATH/src' - 请参阅[如何编写Go代码](https://golang.org/doc/code。html) – JimB

回答

1

显然它试图从Internet上加载它,因为它没有在你的GOPATH中找到“testpack”。

您没有向我们展示您的GOPATH设置或您将“testpack”复制到的位置,所以除了说“我错过了”之外,我只能告诉您。

https://golang.org/cmd/go/#hdr-Relative_import_paths

尝试要么

  • import "./testpack"
  • 设置GOPATH为 “/去” 在您的Dockerfile
    import "github.com/user/myProject/app/testpack"
+0

你好赞,我只是把它作为一个文件夹测试包,我有一个去文件我的Gopath是/ root/work / – ChrisDave

0

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

Golang的最大优点之一是静态编译的可执行文件。编译完成后,您应该能够在任何等效体系结构中运行它。默认情况下,去会尝试编译静态可执行文件,但如果你想执行它(和你没有做任何幻想与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 ),这将减少构建时间并提高部署速度。