为Go web程序构建并发布docker镜像
容器化时代,部署web项目早已不需要购买一台完整的服务器。 我们只需要将程序打包为docker镜像并上传docker hub,容器托管平台(claw run,sealos,zeabur等)便可以通过k8s运行我们的程序,并高度细致分配cpu,内存,硬盘,网络等资源,需要多少用多少,按量付费,相比于购买一台完整的服务器成本更低的同时,也省去了部署的烦琐。 golang作为一门编译型语言,同时可以完全不依赖libc,使得其构建docker镜像时拥有得天独厚的优势。 Dockerfile 这是llmio的DockerFile文件,相比于其他语言可以说是十分简单清晰了。 llmio所使用的数据库是纯go实现的sqlite,没有任何C依赖。 因为需要备份导出sqlite的db文件,需要镜像有一个文件系统,所以我没有使用scratch,而是alpine。 1# Build stage for the frontend 2FROM node:20 AS frontend-build 3WORKDIR /app 4COPY webui/package.json webui/pnpm-lock.yaml ./ 5RUN npm install -g pnpm 6RUN pnpm install 7COPY webui/ . 8RUN pnpm run build 9 10# Build stage for the backend 11FROM golang:latest AS backend-build 12WORKDIR /app 13COPY go.mod go.sum ./ 14RUN GOPROXY=https://goproxy.io,direct go mod download 15COPY . . 16RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o llmio . 17 18# Final stage 19FROM alpine:latest 20 21WORKDIR /app/db 22WORKDIR /app 23 24# Copy the binary from backend build stage 25COPY --from=backend-build /app/llmio . 26 27# Copy the built frontend from frontend build stage 28COPY --from=frontend-build /app/dist ./webui/dist 29 30EXPOSE 7070 31 32# Command to run the application 33CMD ["./llmio"] 时区与TLS证书 当程序需要设置时区或者对外发出https请求时,很多语言会调用操作系统提供的时区配置或openssl,这同样加入了不必要的依赖,然而golang中完全无需担心这些内容,只需要引入两个包即可将两种依赖打包到可执行文件中。 ...