与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"]
这将做到以下几点。
- 将项目文件复制到
/go/src/myapp
。 - 将工作目录设置为
/go/src/myapp
。 - 安装依赖关系,我用get get来取代它,使用你正在使用的依赖关系pipe理工具。
- 安装/构build二进制文件。
- 设置入口点。
您可以使用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"]
- docker检查:如何从范围只select某些键
- Docker golang包导入错误:导入path不以主机名开头
- 如何将stdout从docker容器redirect到主机
- 如何运行docker运行使用Go Sdk的docker?
- 开发和debugging的最佳工作stream程 – 最初部署在docker环境中
- 在Docker容器主机上运行golang应用程序时,获取net / http:TLS握手超时
- 这个Docker命令是如何生成一个小GoLang容器的?
- Go + MySql:迁移到GKE(Google云容器引擎)有多简单?
- Golang:可以肯定地说,如果一个结构体实现了一个方法,那么它就满足了所有定义该方法签名的接口。