我有以下的 Docker 文件,可以工作于我的应用程序。我能够访问简单的 Web 应用服务器。
当我像下面这样采用它时,我无法成功将其部署到Kubernetes。容器崩溃并出现一些一般性错误,而不是我可以使用的东西。
如果有人想要尝试,这是一个简单的程序(最小可重现示例),如果你使用第一个Docker文件,它将适用于你,而对于第二个Docker文件则不行。
FROM golang:1.14.7 AS builder
RUN go get github.com/go-delve/delve/cmd/dlv
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -gcflags="all=-N -l" -o main ./...
FROM alpine:3.12.0 AS production
COPY --from=builder /app .
EXPOSE 8000 40000
ENV PORT=8000
CMD ["./main"]
当我像下面这样采用它时,我无法成功将其部署到Kubernetes。容器崩溃并出现一些一般性错误,而不是我可以使用的东西。
standard_init_linux.go:190: exec user process caused "no such file or directory"
这个不能工作
FROM golang:1.14.7 AS builder
RUN go get github.com/go-delve/delve/cmd/dlv
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -gcflags="all=-N -l" -o main ./...
FROM alpine:3.12.0 AS production
COPY --from=builder /app .
COPY --from=builder /go/bin/dlv /
EXPOSE 8000 40000
ENV PORT=8000
CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "./main"]
如果有人想要尝试,这是一个简单的程序(最小可重现示例),如果你使用第一个Docker文件,它将适用于你,而对于第二个Docker文件则不行。
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
fmt.Println("app is starting!")
var port string
if port = os.Getenv("PORT"); len(port) == 0 {
port = "8080"
}
http.HandleFunc("/", handler)
http.ListenAndServe(":"+port, nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, %s!", r.URL.Path[1:])
}
golang:1.14.6-alpine3.12
。 - Henryarch
等。 - PJEMRUN GOARCH=amd64 go get github.com/go-delve/delve/cmd/dlv
? - user4466350