FROM golang:1.21.4
WORKDIR /app
COPY ./ ./
RUN go build -o ./test .
CMD ["./test"]
它有效,经过测试。
但我建议您继续通过从最终映像中删除源文件和中间构建文件来缩小映像。为此,请使用多阶段构建功能。
FROM golang:1.21.4 as builder
WORKDIR /app
COPY ./ ./
RUN go build -o ./test .
FROM alpine:latest as runner
# добавить glibc для приложения
RUN apk add gcompat
WORKDIR /app
# Скопировать собранный бинарник, "забыв" все остальные файлы из builder
COPY --from=builder /app/test ./
CMD ["./test"]
编译器正确地抱怨。您在
golang
. 在此图像中GOPATH=/go
,当前目录也是如此/go
。该指令COPY ./ ./
将您的应用程序复制到/go
镜像中,并且该指令RUN go build .
还启动了 build in/go
,即内部$GOPATH
您需要在不同的目录中构建。例如,在开头添加一条语句,
WORKDIR
以便所有后续语句在不同的目录中运行:它有效,经过测试。
但我建议您继续通过从最终映像中删除源文件和中间构建文件来缩小映像。为此,请使用多阶段构建功能。
该阶段
builder
使用大图像golang
来构建应用程序。然后该图像被丢弃并用超级紧凑的图像替换alpine
。您唯一alpine
需要添加的glibc
是链接中收集的图像builder
;如果没有这个,它将无法启动。您需要从中
builder
获取团队编译的二进制文件go build
。如果您的应用程序使用任何资源,也需要将它们转移到生产映像中。