使用Go app构建Docker:无法找到包

时间:2017-12-15 17:26:08

标签: docker go

我的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完成ls之后记录ADD命令吗?

6 个答案:

答案 0 :(得分:6)

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

这种方式有几个优点:

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

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

  • 构建第一个功能完整的图像,大约800 MB

  • 将您的程序复制到一个新的空图像并生成大约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"]

答案 1 :(得分:3)

您正在将所有文件复制到Image根目录,没有安装任何依赖项,尝试构建它,然后从/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. 安装依赖项,我用go get但用你正在使用的依赖管理工具替换它。
  4. 安装/构建二进制文件。
  5. 设置入口点。
  6. 您可以使用ls运行docker exec或任何其他命令。

    示例:

    docker exec <image name/hash> ls
    

    您还可以使用

    在生成的图像中输入shell以便更好地理解它
    docker run --rm -it <image hash/name> /bin/sh
    

答案 2 :(得分:1)

对于go 1.11,您可以使用go模块,以下是示例

FROM alpine AS base
RUN apk add --no-cache curl wget

FROM golang:1.11 AS go-builder
WORKDIR /go/app
COPY . /go/app
RUN GO111MODULE=on  CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /go/app/main /go/app/cmd/myapp/main.go

FROM base
COPY --from=go-builder /go/app/main /main
CMD ["/main"]

答案 3 :(得分:0)

myapp需要按照建议/go/src/myapp/usr/local/go/src/myapp。您可以在ADD部分添加它。

答案 4 :(得分:0)

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

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

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

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

FROM scratch
COPY myApp 
CMD ["/myApp"]

答案 5 :(得分:0)

官方文档建议使用以下Dockerfile:

FROM golang:1.8

WORKDIR /go/src/app
COPY . .

RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]

请访问https://hub.docker.com/_/golang以获取更多信息