|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
概要: c+ v6 p5 L* R- C, {+ t% A
实施! d8 T# E+ n; l7 z9 i s
- 修改前的实施时间
- 制作编译用的镜像
- 测试修改后的实施时间6 ?3 g# U, a, a: D( g; M8 e
; B/ q# ?4 E0 {5 W( R" B$ H4 a概要5 i; U' j% @5 Z8 K0 I
使用 docker 打包镜像的时候, 每次耗费时间最多的就是 docker build 的过程. 特别是对于前端工程的打包, 有时候下载依赖包的时间就要 10 几分钟, 这就导致发布版本的效率极低.
4 Q0 ]' w. O3 Q0 ^/ J) R8 h
4 _2 f z' i! R# t' p针对前端工程的打包慢的问题, 目前能想到的有效解决办法就是, 在官方 node 的镜像基础上, 把当前项目用到的 packages 下载好再做个镜像用于编译前端工程用.1 n6 l6 k% V2 j) E% t
# G$ ~' `" k! b- L, F! A
实施) q6 C$ o7 W: a7 ?& y4 h, M
根据上面的方案, 尝试如下.
' e, X( u' d- s8 r% U
( m5 ~" ~. k6 Z: h) k& u9 @修改前的实施时间" w3 `/ Y# R$ n
修改前, 是在 node 镜像中编译前端, 然后将编译之后的代码放入后端的静态文件目录中.% _! t# R) ~/ s; ~1 Z7 p
, t+ x$ ]% p; v2 e4 Y( L& X8 t7 _6 t5 @FROM node:10.15-alpine as front-builder5 V* H3 C4 P& l* C& i
3 T B, X, Z5 w7 P5 u
WORKDIR /user2 [. U0 Y$ x3 X4 w) s
ADD ./frontend/application .
# T! F9 Q" w; i# y; jRUN yarn # 这一步耗费的时间最长+ k- U" b' L+ k" h/ e a* k& h
RUN yarn build: g& `% r+ j( k: j6 t" [
& z) C. |$ A# D: u* C. u7 W
! ?, T$ l1 v* `( K
FROM golang:1.12.5-alpine3.9 as back-builder3 w+ I! V4 r& _" M4 |" q, v4 _
: }& w' n c& J1 Q, i' F; m0 q# N N4 Q
WORKDIR /go
3 Q& I: U+ b. WRUN mkdir -p ./src/xxx. S) g* M& C5 u, ?
ADD ./backend/src/xxx ./src/xxx
! ]' ]. l* m7 f, R0 r) KRUN go install xxx- d% S, N$ j& }4 g( C; p7 U
2 s6 X8 q0 B& C0 Q7 q1 I
3 }1 L% q7 V, [FROM golang:1.12.5-alpine3.9' M$ {. P! y* ^" e
/ H3 f) H7 u7 h$ E2 {5 I
WORKDIR /app
8 k0 x. K9 w# ]/ H% UCOPY --from=front-builder /user/build ./public
; Z1 r- k) l! t4 J' c5 kCOPY --from=back-builder /go/bin/xxx .( x/ u( v. a3 d6 A$ H7 {
7 d- M2 a' O' i5 A
CMD ["./xxx"]
& M. N/ h# q$ Q8 g1 ?: N8 @4 o0 ~这种方式的编译时间如下:
% O5 e- N0 D4 M
* e! { ` \5 }- z: y d, Nreal 14m27.639s
' @* i; Q" }% G7 n: zuser 0m0.812s( s/ H& {8 V$ p
sys 0m0.108s
$ K! z7 y' ~' b7 A) ~1 w" o, P5 A制作编译用的镜像6 f7 F" m% n/ E" o5 f
前端编译用的镜像 DockeRFile 如下:. _0 T5 D- C9 g2 Q; r* w, X6 W# q- _
, `5 A6 F- Z# N- V; D9 [FROM node:10.15-alpine. `9 Q: @- V9 ]. @3 M
" M# _" z8 O. a! O. U$ X! t
WORKDIR /user' E& [5 \; K: P4 \ v9 k# m6 C
ADD ./frontend/application .: ~8 x4 S4 t. w) T2 O+ ~$ h. s
RUN yarn) V2 ]8 ~7 G) c
RUN rm -rf `grep -v "node_modules" | grep -v "yarn.lock"`/ j: ?3 ~6 X3 D* A: S, u- ]
docker build 命令: ( 目录结构根据具体的项目调整 )
. ?" b, H$ p( O3 r3 @ U W1 g9 s2 E/ z& W- i) L
# 这里的 Dockerfile 就是上面的内容, 编译后会生成名称为 node-application-cache 的 image9 |8 Q: Y) }: i3 M2 J: e, J6 ]
docker build -f ./Dockerfile -t node-application-cache ./ h( w3 n6 f \( j4 d
测试修改后的实施时间
$ V( q* b3 ]1 r4 @$ Q! Gdockerfile 和修改前的基本一样, 只改了第一行
3 ]2 I1 w6 Q1 T, z
[# g" \' B8 S) C. J$ K# FROM node:10.15-alpine as front-builder
- ?! F+ h2 M. {# w7 b3 z9 S) \% ZFROM node-application-cache:latest as front-builder
, v: a b) L! S编译时间如下:
0 z4 Y8 Y2 n& ?0 Z
$ P1 e; R5 t# J* q9 S( Qreal 1m17.399s) F5 B7 Z- o& d6 d" w
user 0m0.836s
. i+ p. P# ^, G3 psys 0m0.136s
. H4 [ h( k, e使用了带前端缓存的 image, 整体时间缩短了 14 倍左右 中途编译用的镜像(node-application-cache)比之前的(node:10.15-alpine)大很多, 但是最终发布的镜像还是一样大. |
|