与Go应用程序构buildDocker:无法find包

我有我的Dockerfile与src/myapp文件夹的目录的根目录, myapp包含myapp.go与主包。

Dockerfile如下所示:

 FROM golang:1.9.2 ADD . / RUN go build myapp; ENTRYPOINT ["/go/bin/myapp"] 

我得到以下错误:

 can't load package: package myapp: cannot find package "myapp" in any of: /usr/local/go/src/myapp (from $GOROOT) /go/src/myapp (from $GOPATH) 

我究竟做错了什么? 在docker完成ADD之后,我可以loggingls命令吗?

您正在将所有文件复制到映像根目录,未安装任何依赖项,尝试构build它,然后从/go/bin/app运行二进制文件。 该二进制文件不存在于该目录中,并且正在生成错误。

我会推荐使用像这样的Dockerfile,

 FROM golang:1.9.2 ADD . /go/src/myapp WORKDIR /go/src/myapp RUN go get myapp RUN go install ENTRYPOINT ["/go/bin/myapp"] 

这将做到以下几点。

  1. 将项目文件复制到/go/src/myapp
  2. 将工作目录设置为/go/src/myapp
  3. 安装依赖关系,我用get get来取代它,使用你正在使用的依赖关系pipe理工具。
  4. 安装/构build二进制文件。
  5. 设置入口点。

您可以使用docker exec运行ls或其他任何命令。

例:

 docker exec <image name/hash> ls 

你也可以在生成的图像中inputshell来很好地理解它

 docker run --rm -it <image hash/name> /bin/sh 

经过实验,我已经开始构buildGolang应用程序。

这种方式有几个优点:

  • 依赖关系安装在构build阶段

  • 如果您需要,您可以取消注释testing选项

  • build立约800 MB的第一个function齐全的图像

  • 复制您的程序到一个新鲜的空白图像,并产生约10 MB的非常小的图像

Dockerfile

 # Two-stage build: # first FROM prepares a binary file in full environment ~780MB # second FROM takes only binary file ~10MB FROM golang:1.9 AS builder RUN go version COPY . "/go/src/github.com/your-login/your-project" WORKDIR "/go/src/github.com/your-login/your-project" #RUN go get -v -t . RUN set -x && \ #go get github.com/2tvenom/go-test-teamcity && \ go get github.com/golang/dep/cmd/dep && \ dep ensure -v RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /your-app CMD ["/your-app"] EXPOSE 8000 ######### # second stage to obtain a very small image FROM scratch COPY --from=builder /your-app . EXPOSE 8000 CMD ["/your-app"] 

myapp需要位于/go/src/myapp中,或者在/usr/local/go/src/myapp 。 您可以将其添加到ADD部分。

如果目标是创build一个容器,只是运行你的二进制文件,我会采取不同的方法。

首先为linux构build二进制文件:

 GOOS=linux CGO_ENABLED=0 go build -a -installsuffix cgo 

然后从头开始构build一个轻量级的Docker镜像:

 FROM scratch COPY myApp CMD ["/myApp"]