网站建设需要实现哪些目标东莞网站建设代理

张小明 2025/12/31 22:16:44
网站建设需要实现哪些目标,东莞网站建设代理,南昌关键词优化软件,苏州企业网站设计开发上次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进行投诉反馈,一经查实,立即删除!

广州手机网站建设报价表泰安泰斗网络科技有限公司

超简单方案:用开源工具合规获取安卓设备标识 【免费下载链接】Android_CN_OAID 安卓设备唯一标识解决方案,可替代移动安全联盟(MSA)统一 SDK 闭源方案。包括国内手机厂商的开放匿名标识(OAID)、海外手机平台…

张小明 2025/12/31 17:02:08 网站建设

农博园网站建设投标书苏州手机网站制作

ADS仿真实战指南:快速获取ATC电感电容S2P完整模型库 【免费下载链接】ADS仿真ATC模型库下载与使用指南 ADS仿真ATC模型库下载与使用指南 项目地址: https://gitcode.com/open-source-toolkit/d7c29 在射频电路设计中,ADS仿真软件配合精确的元器件…

张小明 2025/12/31 17:02:08 网站建设

果洛营销网站建设哪家好wordpress阅读更多标签

4K电视画质检测完全指南:专业测试图库深度解析 【免费下载链接】4K液晶电视专业测试图片集 探索4K液晶电视的真实性能,这套3840x2160分辨率的高清测试图片集是您的理想选择。专为检测电视屏幕的坏点、背光均匀性、解析度、色彩饱和度及对比度等关键指标而…

张小明 2025/12/31 17:02:11 网站建设

杭州外贸网站多少钱开发者选项怎么打开

HuggingFace镜像网站推荐:结合PyTorch-CUDA-v2.8加速大模型推理 在如今的大模型时代,谁能更快地跑通第一个 from transformers import AutoModel,谁就更有可能抢占实验先机。然而现实往往骨感:刚配好 Python 环境,发现…

张小明 2025/12/31 17:02:09 网站建设

一起做网站17杭州女装广告设计作品

使用 Hiera 管理数据 1. 使用 literal() 函数 在 Hiera 中,百分号(%)用于插值。但有时我们需要在数据中指定一个字面意义的百分号,例如 Apache 配置中使用的 %{HTTP_HOST} 。为了在 Hiera 数据中写入这样的值,我们需要使用 literal() 函数。 示例:要将 %{HTTP_HO…

张小明 2025/12/31 17:02:09 网站建设

上海网站搜索引擎优化html页面跳转

量子技术在供应链管理与认知科学中的应用探索 1. 量子机器学习在供应链需求预测中的应用 1.1 供应链需求预测现状 在全球商业不断发展的背景下,高效的供应链管理至关重要,而准确的需求预测是其中的核心环节。传统的需求预测方法主要依赖统计方法和常规机器学习技术,通过分…

张小明 2025/12/31 17:02:10 网站建设