静态网站生成自驾游黄山风景区旅游攻略

张小明 2025/12/30 16:35:51
静态网站生成,自驾游黄山风景区旅游攻略,用dedecms做的网站 脚本是什么,软件开发流程图怎么做上次review同事的Dockerfile#xff0c;一个Go服务的镜像打出来1.2G。 “这也太大了吧#xff1f;” “能跑就行呗。” 能跑是能跑#xff0c;但每次部署拉镜像就要好几分钟#xff0c;磁盘空间也吃不消。 花了半天时间优化#xff0c;最后压到47M#xff0c;记录一下过程…上次review同事的Dockerfile一个Go服务的镜像打出来1.2G。“这也太大了吧”“能跑就行呗。”能跑是能跑但每次部署拉镜像就要好几分钟磁盘空间也吃不消。花了半天时间优化最后压到47M记录一下过程。问题分析先看看原来的DockerfileFROM golang:1.21 WORKDIR /app COPY . . RUN go mod download RUN go build -o main . EXPOSE 8080 CMD [./main]看起来没毛病但问题就出在这里。镜像分析# 查看镜像大小docker images|grepmyapp myapp latest abc1231.24GB# 用dive分析镜像层dive myapp:latest分析结果golang:1.21基础镜像就有800MB加上源码、依赖、编译产物妥妥过1G优化方案阶段一多阶段构建最立竿见影的优化编译和运行分开。# 阶段1编译 FROM golang:1.21 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -o main . # 阶段2运行 FROM alpine:3.18 WORKDIR /app COPY --frombuilder /app/main . EXPOSE 8080 CMD [./main]效果docker images|grepmyapp myapp latest def456 28MB直接从1.2G降到28MB降了97%。原理很简单编译阶段用完整的golang镜像运行阶段只拷贝编译好的二进制文件用alpine替代完整系统本身才5MB阶段二进一步压缩28MB还能更小吗可以。# 阶段1编译 FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -ldflags-s -w -o main . # 阶段2运行 FROM scratch COPY --frombuilder /app/main /main EXPOSE 8080 ENTRYPOINT [/main]改进点编译阶段也用alpine加快构建加上-ldflags-s -w去掉调试信息用scratch空镜像替代alpinedocker images|grepmyapp myapp latest ghi789 12MB从28MB又降到12MB。阶段三UPX压缩可选如果想更极致FROM golang:1.21-alpine AS builder # 安装upx RUN apk add --no-cache upx WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 GOOSlinux go build -ldflags-s -w -o main . RUN upx --best --lzma main FROM scratch COPY --frombuilder /app/main /main EXPOSE 8080 ENTRYPOINT [/main]docker images|grepmyapp myapp latest jkl0124.7MB从12MB降到4.7MB。但UPX有个问题程序启动时需要解压会增加启动时间。适合对镜像大小极度敏感但对启动速度不敏感的场景。不同语言的优化策略Java项目Java比较麻烦因为需要JVM。# 阶段1编译 FROM maven:3.9-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 阶段2运行 FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --frombuilder /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]关键点用jre-alpine替代完整JDK分离依赖下载和代码编译利用缓存Java还可以用jlink自定义运行时FROM eclipse-temurin:17 AS jre-builder RUN jlink \ --add-modules java.base,java.logging,java.sql,java.naming,java.management \ --strip-debug \ --no-man-pages \ --no-header-files \ --compress2 \ --output /javaruntime FROM alpine:3.18 COPY --fromjre-builder /javaruntime /opt/java COPY --frombuilder /app/target/*.jar /app/app.jar ENV PATH/opt/java/bin:${PATH} ENTRYPOINT [java, -jar, /app/app.jar]自定义的JRE只有几十MB比完整JRE小很多。Node.js项目# 阶段1构建 FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . RUN npm run build # 阶段2运行 FROM node:20-alpine WORKDIR /app COPY --frombuilder /app/dist ./dist COPY --frombuilder /app/node_modules ./node_modules COPY package*.json ./ USER node EXPOSE 3000 CMD [node, dist/index.js]Node项目主要是node_modules太大优化方向只装生产依赖用npm ci替代npm install考虑用esbuild打包成单文件Python项目# 阶段1构建 FROM python:3.11-alpine AS builder RUN apk add --no-cache gcc musl-dev WORKDIR /app COPY requirements.txt . RUN pip install --user --no-cache-dir -r requirements.txt # 阶段2运行 FROM python:3.11-alpine WORKDIR /app COPY --frombuilder /root/.local /root/.local COPY . . ENV PATH/root/.local/bin:$PATH EXPOSE 8000 CMD [python, app.py]缓存优化镜像大小优化完了顺便说说构建速度。利用层缓存# 好的写法先复制依赖文件 COPY go.mod go.sum ./ RUN go mod download # 再复制源码 COPY . . RUN go build -o main .# 差的写法一起复制 COPY . . RUN go mod download RUN go build -o main .好的写法只要依赖不变go mod download这层就会走缓存。.dockerignore别忘了加.dockerignore.git .gitignore *.md .idea .vscode node_modules vendor *.log Dockerfile docker-compose.yml不然COPY .会把一堆没用的东西复制进去。安全优化镜像瘦身的同时顺便做一下安全加固。非root用户FROM alpine:3.18 RUN addgroup -S appgroup adduser -S appuser -G appgroup WORKDIR /app COPY --frombuilder /app/main . RUN chown -R appuser:appgroup /app USER appuser EXPOSE 8080 CMD [./main]只读文件系统# docker-compose.ymlservices:app:image:myappread_only:truetmpfs:-/tmp扫描漏洞# 用trivy扫描trivy image myapp:latest选择维护良好的基础镜像及时更新。实际效果对比优化阶段镜像大小构建时间原始版本1.24GB45s多阶段alpine28MB38sscratchldflags12MB35sUPX压缩4.7MB52s推荐停在scratchldflags这个阶段性价比最高。部署效率提升镜像从1.2G降到12MB后推送到仓库从3分钟变成5秒拉取镜像从2分钟变成2秒磁盘占用一台机器能放更多版本特别是跨区域部署的时候镜像小就是快。我们有几个异地节点之前用星空组网把节点连起来后小镜像部署基本感觉不到延迟。常见问题Q1scratch镜像没有shell怎么调试# 需要调试就用alpine FROM alpine:3.18 # 或者用busybox FROM busybox:latestQ2CGO_ENABLED0是什么意思禁用CGO编译成纯静态二进制。不依赖glibc才能在scratch里跑。如果你的代码用了CGO比如用了sqlite3就不能这样玩。Q3alpine里程序跑不起来可能是glibc的问题。alpine用的是musl。解决方案编译时用alpine对应的golang镜像或者静态编译总结Docker镜像瘦身的核心技巧技巧适用场景效果多阶段构建所有项目立竿见影小基础镜像大多数项目很明显ldflags去调试信息Go项目减少30-50%UPX压缩对大小极端敏感减少60-70%.dockerignore所有项目加快构建一句话总结多阶段构建 合适的基础镜像就能解决90%的问题。有其他镜像优化技巧欢迎评论区分享~
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

请专业公司做个网站要花多少钱建站公司塔山双喜

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 生成交互式MySQL入门教程:1.分步可视化启动流程;2.嵌入式Linux终端模拟器;3.实时错误诊断提示;4.包含测试你的理解小测验&#xff1b…

张小明 2025/12/30 16:35:50 网站建设

福建省建设招投标网站建设网上银行官方网站

摘要昆虫是地球上多样性最丰富的动物类群,在生态系统、农业和人类健康中发挥着关键作用。高质量基因组和各类多组学数据集的快速积累,为推进昆虫生物学与进化研究提供了前所未有的机遇,但也带来了数据整合、可及性和复用性等挑战。为满足这些…

张小明 2025/12/30 16:35:16 网站建设

OA网站建设分析学做ps的软件的网站有哪些内容

I科技圈,Qwen因其开源模型数量位居世界第一、模型涵盖各种大小、开销低而表现不俗,被称为“源神(开源界的神)”。这也导致有些人在体验之后,觉得Qwen写的代码质量是国内第一,仅次于Claude、chatGPT、Gemini…

张小明 2025/12/30 16:34:41 网站建设

深圳网站制作公司讯网站title设置

31 值对象进阶(下):值对象与实体的 3 个核心区别(面试高频考点) 你好,欢迎来到第 31 讲。 在过去的几讲中,我们已经深入地探讨了值对象和实体。我们知道,它们是构成我们领域模型的两个最基本的“原子”构建块。 实体:拥有唯一身份标识,关注“是谁”。 值对象:没有…

张小明 2025/12/30 16:34:07 网站建设

盐城网站制作网络推广在线生成小程序

2025年,三亚的亚健康康养领域迎来了新的发展机遇。此次推荐榜涵盖了多家在健康管理和康养咨询方面具有领先优势的公司。通过结合现代医疗技术和丰富的自然资源,这些服务商致力于帮助客户应对亚健康问题,提升整体健康水平。在服务过程中&#…

张小明 2025/12/30 16:33:32 网站建设

广州网站建设吧百度入口网址

Step1:安装jdk 由于我的burpsuite是1.7版本的,所以我选择了jdk8的版本。 安装好之后,验证一下Step2:打开burp-loader-keygen.jar文件获取key常见问题:双击该jar文件打不开双击文件之后,总是默认是上面这个打开方式,但这…

张小明 2025/12/30 16:32:58 网站建设