docker 通过中间镜像加速部署

本文介绍了一种通过创建预装依赖的Docker镜像来显著提高前端工程构建速度的方法,实测编译时间从14分钟缩短至1分钟,效率提升明显。

概要

使用 docker 打包镜像的时候, 每次耗费时间最多的就是 docker build 的过程. 特别是对于前端工程的打包, 有时候下载依赖包的时间就要 10 几分钟, 这就导致发布版本的效率极低.

针对前端工程的打包慢的问题, 目前能想到的有效解决办法就是, 在官方 node 的镜像基础上, 把当前项目用到的 packages 下载好再做个镜像用于编译前端工程用.

实施

根据上面的方案, 尝试如下.

修改前的实施时间

修改前, 是在 node 镜像中编译前端, 然后将编译之后的代码放入后端的静态文件目录中.

FROM node:10.15-alpine as front-builder

WORKDIR /user
ADD ./frontend/application .
RUN yarn                        #  这一步耗费的时间最长
RUN yarn build


FROM golang:1.12.5-alpine3.9 as back-builder

WORKDIR /go
RUN mkdir -p ./src/xxx
ADD ./backend/src/xxx ./src/xxx
RUN go install xxx


FROM golang:1.12.5-alpine3.9

WORKDIR /app
COPY --from=front-builder /user/build ./public
COPY --from=back-builder /go/bin/xxx .

CMD ["./xxx"]

这种方式的编译时间如下:

real    14m27.639s
user    0m0.812s
sys     0m0.108s

制作编译用的镜像

前端编译用的镜像 Dockerfile 如下:

FROM node:10.15-alpine

WORKDIR /user
ADD ./frontend/application .
RUN yarn
RUN rm -rf `grep -v "node_modules" | grep -v "yarn.lock"`

docker build 命令: ( 目录结构根据具体的项目调整 )

# 这里的 Dockerfile 就是上面的内容, 编译后会生成名称为 node-application-cache 的 image
docker build -f ./Dockerfile -t node-application-cache .

测试修改后的实施时间

dockerfile 和修改前的基本一样, 只改了第一行

# FROM node:10.15-alpine as front-builder
FROM node-application-cache:latest as front-builder

编译时间如下:

real    1m17.399s
user    0m0.836s
sys     0m0.136s

使用了带前端缓存的 image, 整体时间缩短了 14 倍左右 中途编译用的镜像(node-application-cache)比之前的(node:10.15-alpine)大很多, 但是最终发布的镜像还是一样大.

转载于:https://www.cnblogs.com/wang_yb/p/11013550.html

### 如何加速 Docker 镜像拉取和构建的最佳实践 #### 使用多阶段构建减少镜像大小 通过采用多阶段构建,可以在最终的生产环境中仅保留必要的文件,从而减小镜像体积。这不仅加快了传输速度也减少了存储空间占用。 ```dockerfile FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp . FROM alpine:latest WORKDIR /root/ COPY --from=builder /app/myapp . CMD ["./myapp"] ``` 此方法可以显著降低镜像尺寸并提高部署效率[^1]。 #### 利用缓存机制优化层加载时间 合理安排 `Dockerfile` 中指令顺序能够有效利用本地缓存来加速后续构建过程。对于那些不经常变化的部分(如依赖库),应该放在更前面的位置;而对于频繁变动的内容,则应置于后面以防止破坏之前的缓存命中率。 ```dockerfile # 安装依赖包之前先设置环境变量和其他固定配置项 ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && \ apt-get install -y software-properties-common python-software-properties && \ add-apt-repository ppa:certbot/certbot && \ apt-get update && \ apt-get install -y certbot # 复制源码到工作目录之后再执行编译等操作 COPY src/ /opt/src/ WORKDIR /opt/src RUN make all ``` 这样做的好处是可以让每次重新构建时尽可能多地重用已有的中间层数据,进而缩短整体耗时[^2]。 #### 并行化下载基础镜像与应用资源 当创建一个新的容器实例时,默认情况下只会等待所需的基础镜像被完全获取完毕才会继续下一步骤。然而,在某些场景下可以通过预先启动多个进程分别负责不同部分的数据抓取任务实现并发处理效果,以此达到提速的目的。 例如使用阿里云提供的国内加速器服务地址作为官方仓库代理: ```bash sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-accelerator-address.mirror.aliyun.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ``` 上述配置更改后即可享受更快捷稳定的国内外网络连接体验。 #### 构建过程中启用压缩特性 如果目标平台支持的话,还可以考虑开启 tarball 文件打包期间所使用的 gzip 或者 bzip2 算法来进行一定程度上的体积缩减。不过需要注意的是这样做可能会增加 CPU 负载开销,因此需权衡利弊做出合适的选择。 在 `.dockerignore` 文件里指定忽略掉不必要的路径也能起到相同的作用——即只上传真正有用的资料给远程服务器端保存起来形成新的版本号。 ```plaintext node_modules/ .git/ *.log __pycache__ .DS_Store Thumbs.db ``` 这些措施有助于进一步精简待转移对象集合规模,间接促进了整个流程的速度提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值