我正在尝试在Docker容器中获取Go应用。这是我的第一个更大的Go and Docker项目。只要我在本地计算机上运行go程序,它就可以正常运行,现在我想在docker容器中的EC2上运行它。我的docker文件如下所示:
aapt add app.apk.unaligned ./bin/classes.dex
但是对于每个私有依赖项,我都会收到以下错误消息:
FROM golang:latest
RUN mkdir /tir
ADD . /tir
WORKDIR /tir
RUN go build -o main .
CMD ["/app/main"]
当我在main.go:17:2: cannot find package "github.com/ser/model" in any of:
/usr/local/go/src/github.com/ser/model (from $GOROOT)
/go/src/github.com/ser/model (from $GOPATH)
之前插入RUN go get ./..
时,每个软件包都会收到以下错误消息:
RUN go build -o main .
软件包github.com/ser/endpoints:退出状态128
我尝试了几种解决方案,但是都没有用。我总是最终遇到上述错误。既然这是我的第一个docker + golang项目,那么有没有准备好将dockerfiles用于具有公共和私有依赖关系的golang应用程序?
更新: 我卸载了go,并一一复制了每个文件,并在每个文件后使用了dep -ensure。现在可以了,谢谢:D
答案 0 :(得分:1)
您的依赖项可能存储在GOPATH/src/<import-path>
中,您可以使用go get
工具进行管理。
因此,您的依赖项将包含在源代码管理中,并且项目将更加可移植。
您还可以改善创建Docker
图像的方式。
当前实现使用一个包含整个GO
工具链的容器。代码被复制到该容器内部,容器编译并托管代码。生产只需要稍后。
更好的选择是使用2个容器:
# Debian image with the latest version of Go installed
# and a workspace (GOPATH) configured at /go.
FROM golang:1.11 as builder
WORKDIR /go/src/github.com/space/project/
# Copy the local package files to the container's workspace.
ADD . /go/src/github.com/space/project/
# Build the service inside the container.
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM centurylink/ca-certs
EXPOSE 8080
# Copy app
COPY --from=builder /go/src/github.com/space/project/app /
ENTRYPOINT ["/app"]