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
+ 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 X4 h; [% j7 P+ {4 f) ?4 l: S
WORKDIR /user
: L, T1 p/ d3 tADD ./frontend/application .
) h% y, ]$ t# @3 W1 P5 m1 B4 ]RUN yarn                        #  这一步耗费的时间最长
# @+ e' e7 O: g# `  j3 RRUN yarn build
0 `6 \7 }* m, Q. Q# K6 u
' w; x: P9 C; ~/ o0 R1 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 uRUN mkdir -p ./src/xxx
; I9 {! k0 k4 G: {ADD ./backend/src/xxx ./src/xxx5 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 mFROM golang:1.12.5-alpine3.96 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 jCOPY --from=front-builder /user/build ./public
2 J  O; y. M1 B- c7 oCOPY --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 csys     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- pFROM node:10.15-alpine7 p, E% l" I; m' L0 z, g0 [" H( V

3 Z0 t! e: b2 x- E" vWORKDIR /user: \( M- l$ N0 t& r% Z% j2 \& x
ADD ./frontend/application .
' @  n6 w% D' I' f5 ARUN 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 ndocker build -f ./Dockerfile -t node-application-cache .
' f/ v$ ~4 \( V' {; ]测试修改后的实施时间
* `0 }5 y8 K4 B4 ^% A5 a* edockerfile 和修改前的基本一样, 只改了第一行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 Nreal    1m17.399s, p) a& K% z" P" P* ^* @: H: ?& ^
user    0m0.836s
* W' A( ]  ^4 k; j  |sys     0m0.136s1 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