因此,我正在尝试将golang应用程序与其他包含我的主文件补充代码的目录进行docker化。 我正在使用大猩猩/ mux 。目录结构如下所示。
$GOPATH/src/github.com/user/server
|--- Dockerfile
|--- main.go
|--- routes/
handlers.go
|--- public/
index.gohtml
它可以在我的主机上正常运行。问题是,当我尝试部署Docker映像时,它无法运行并在创建后不久退出。我尝试将dockerfile中的 WORKDIR 命令更改为 / go / src 并将所有文件转储到那里,但是还是没有运气。我也尝试过docker hub上的官方文档。也不起作用。
我的Dockerfile。
FROM golang:latest
WORKDIR /go/src/github.com/user/server
COPY . .
RUN go get -d github.com/gorilla/mux
EXPOSE 8000
CMD ["go","run","main.go"]
我的golang main.go
package main
import (
"github.com/gorilla/mux"
"github.com/user/server/routes"
"log"
"net/http"
"time"
)
func main(){
//...
}
当我检查Docker映像的日志时收到此错误消息。
错误消息
main.go:5:2: cannot find package "github.com/user/server/routes" in any of:
/usr/local/go/src/github.com/user/server/routes (from $GOROOT)
/go/src/github.com/user/server/routes (from $GOPATH)
答案 0 :(得分:1)
尝试以下Docker
文件:
# GO Repo base repo
FROM golang:1.12.0-alpine3.9 as builder
RUN apk add git
# Add Maintainer Info
LABEL maintainer="<>"
RUN mkdir /app
ADD . /app
WORKDIR /app
COPY go.mod go.sum ./
# Download all the dependencies
RUN go mod download
COPY . .
# Build the Go app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# GO Repo base repo
FROM alpine:latest
RUN apk --no-cache add ca-certificates curl
RUN mkdir /app
WORKDIR /app/
# Copy the Pre-built binary file from the previous stage
COPY --from=builder /app/main .
# Expose port 8000
EXPOSE 8000
# Run Executable
CMD ["./main"]
在这里,我们正在创建一个中间docker builder
容器,将代码复制到其中,在builder
容器中构建代码,然后将binary
映像复制到实际的docker。 / p>
这将有助于使所有依赖项都包含在最终容器中,并且最终图像的大小将非常小