EDA365电子论坛网
标题:
docker 通过中间镜像加速部署
[打印本页]
作者:
baqiao
时间:
2020-7-6 16:58
标题:
docker 通过中间镜像加速部署
概要
' p$ B9 i$ G) w$ I P M
实施
& b2 t" T% v' m- G) g' E
修改前的实施时间
制作编译用的镜像
测试修改后的实施时间
$ D- [; I2 y- E( l5 o
+ e2 C$ {( `; k! H- m) z' m7 n
概要
% l" [& m4 \, s1 ^* c6 S2 T
使用 docker 打包镜像的时候, 每次耗费时间最多的就是 docker build 的过程. 特别是对于前端工程的打包, 有时候下载依赖包的时间就要 10 几分钟, 这就导致发布版本的效率极低.
+ ?) R" R( Y1 B, t$ y' O: g! M
+ q- p% k5 \: E7 e7 ?- x
针对前端工程的打包慢的问题, 目前能想到的有效解决办法就是, 在官方 node 的镜像基础上, 把当前项目用到的 packages 下载好再做个镜像用于编译前端工程用.
7 T" F0 k G5 T9 v, Q- L* c- j
% T C( k& _8 b! e, F) {1 d
实施
, `) u1 b$ z* \8 O5 x- J% h; C) ~
根据上面的方案, 尝试如下.
/ x d9 N7 e- o& Y2 c H
- Q: n0 O1 H2 P- `/ p
修改前的实施时间
9 }! ^" C! u. y* @2 N% N7 t* z% {
修改前, 是在 node 镜像中编译前端, 然后将编译之后的代码放入后端的静态文件目录中.
% t, M$ W( ^' ], `! {. E T
4 W5 S1 l8 `6 v1 v l
FROM node:10.15-alpine as front-builder
b- e+ ]2 ?. [8 X
4 h; [% j7 P+ {4 f) ?4 l: S
WORKDIR /user
: L, T1 p/ d3 t
ADD ./frontend/application .
) h% y, ]$ t# @3 W1 P5 m1 B4 ]
RUN yarn # 这一步耗费的时间最长
# @+ e' e7 O: g# ` j3 R
RUN yarn build
0 `6 \7 }* m, Q. Q# K6 u
' w; x: P9 C; ~/ o0 R
1 A" ]3 e- L7 S
FROM golang:1.12.5-alpine3.9 as back-builder
/ r3 c) m/ a. T& \
/ {7 e; s' X6 j; K4 q
WORKDIR /go
1 ^* T4 f) _' w- `2 u
RUN mkdir -p ./src/xxx
; I9 {! k0 k4 G: {
ADD ./backend/src/xxx ./src/xxx
5 C' i: y4 E+ k7 j, s! `
RUN go install xxx
/ [1 x9 D6 Y0 l9 h- E9 D
& l% _9 c o6 w( R& [
2 ~' C" v7 B5 d( N; f3 m
FROM golang:1.12.5-alpine3.9
6 o: z! a; l) d1 j- y, w! I7 g
4 w5 q" v5 y3 Z8 b, ]7 f( l% |1 @
WORKDIR /app
. z& S' j7 f+ c' ^/ `8 j
COPY --from=front-builder /user/build ./public
2 J O; y. M1 B- c7 o
COPY --from=back-builder /go/bin/xxx .
# P0 P3 }3 D& B; A) m; T
5 ~$ j1 r8 q) `! B7 W
CMD ["./xxx"]
. y0 M0 _0 u, I6 N
这种方式的编译时间如下:
0 O! t, z$ L' N0 ~& c7 l) @$ [
: r% ]9 H6 m( P- }
real 14m27.639s
% D5 h: h ?$ e; d5 z8 Z m: Q
user 0m0.812s
' u5 S. }2 w3 c
sys 0m0.108s
1 K4 E# g4 h6 Q- h& G Q
制作编译用的镜像
+ R, p8 h! s; a: Q
前端编译用的镜像 Dockerfile 如下:
" e" R+ c& o; j. M
_; D/ D7 r ?- F: H- p
FROM node:10.15-alpine
7 p, E% l" I; m' L0 z, g0 [" H( V
3 Z0 t! e: b2 x- E" v
WORKDIR /user
: \( M- l$ N0 t& r% Z% j2 \& x
ADD ./frontend/application .
' @ n6 w% D' I' f5 A
RUN yarn
- g$ z l' P7 ^( T/ T n& ?
RUN rm -rf `grep -v "node_modules" | grep -v "yarn.lock"`
8 R1 o3 U2 Q2 N, r. [& Q6 P. ]& {; l
docker build 命令: ( 目录结构根据具体的项目调整 )
4 i6 { k8 R' U. m8 `; B% G, ~0 B& d, A
7 N# d4 U8 t& ]2 _7 Y. W
# 这里的 Dockerfile 就是上面的内容, 编译后会生成名称为 node-application-cache 的 image
$ [& E' n4 ^3 ?: x+ Z# w$ m$ Y3 h9 n
docker build -f ./Dockerfile -t node-application-cache .
' f/ v$ ~4 \( V' {; ]
测试修改后的实施时间
* `0 }5 y8 K4 B4 ^% A5 a* e
dockerfile 和修改前的基本一样, 只改了第一行
8 m+ h) n F/ D( j
* @) E+ s' i# [3 v2 a3 h% M- k
# FROM node:10.15-alpine as front-builder
" m% f0 B% @ v6 O
FROM node-application-cache:latest as front-builder
% t0 Y3 m/ l1 }& c1 p# O1 _/ L
编译时间如下:
0 s. Q5 X8 C f- P/ g
& R- p2 c& I6 N
real 1m17.399s
, p) a& K% z" P" P* ^* @: H: ?& ^
user 0m0.836s
* W' A( ] ^4 k; j |
sys 0m0.136s
1 w8 g7 E, Z6 M5 O
使用了带前端缓存的 image, 整体时间缩短了 14 倍左右 中途编译用的镜像(node-application-cache)比之前的(node:10.15-alpine)大很多, 但是最终发布的镜像还是一样大.
作者:
regngfpcb
时间:
2020-7-6 18:52
docker 通过中间镜像加速部署
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2