2 回答
TA贡献1866条经验 获得超5个赞
首先,您使用的是多阶段 Docker 构建,它非常适合仅将编译的二进制文件复制到最终映像。但是,在 Dockerfile 中,您将复制整个构建目录 - 二进制文件以及所有源代码。server
其次,您的主要问题是当图像作为容器运行时,默认工作目录是 - 因此服务器中的任何路径都找不到中的html文件。//bin/public
如果你需要调试一个 docker 镜像 - 特别是如果它是一个基于 linux 发行版(如 alpine)的镜像 - 只需:
docker run -it myimage /bin/sh
无论如何,对您的docker的2个简单修复:
FROM golang:1.15.2-alpine3.12 AS builder
WORKDIR /app
COPY . .
WORKDIR /app/site
RUN CGO_ENABLED=0 GOOS=linux go build -o server
FROM alpine:3.12
COPY --from=builder /app/site/server /bin
COPY --from=builder /app/site/public /public
ENTRYPOINT [ "/bin/server" ]
TA贡献2016条经验 获得超9个赞
在Go 1.16中,您可以将这些文件编译成二进制文件本身。因此,您需要升级主机系统上的 Go 工具链,以及 Dockerfile 中构建阶段的行。Go 1.16 添加了嵌入包和一个新指令来支持这一点。FROM//go:embed
首先,您需要告诉编译器嵌入模板文件,构建一个文件系统对象:
import "embed"
// templateFiles contains the raw text of the template files.
//go:embed public/views/*.html
var templateFiles embed.FS
然后,当你去使用它时,Go 1.16还会添加一个相应的(“html/template”)。解析FS函数:
renderer := &TemplateRenderer{
templates: template.Must(template.ParseFS(templateFiles)),
}
现在所有文件都嵌入在二进制文件本身中,您不应该收到“找不到文件”类型错误。您可以考虑仅将已编译的二进制文件复制到最终映像中,而不将任何其他内容复制到最终映像中。
# Upgrade to Go 1.16
FROM golang:1.16-alpine3.12 AS builder
# Unchanged from original
WORKDIR /app
COPY . .
WORKDIR /app/site
RUN CGO_ENABLED=0 GOOS=linux go build -o server
FROM alpine:3.12
# Only copy the compiled binary and not the source tree
COPY --from=builder /app/site/server /bin
# Generally prefer CMD to ENTRYPOINT
CMD [ "server" ]
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报