2 . 精简为美
# v1
FROM nginx:1.15-alpine
RUN echo "hello"
RUN echo "demo best practise"
ENTRYPOINT [ "/bin/sh" ]
# v2
FROM nginx:1.15-alpine
RUN echo "hello"
RUN echo "demo best practise 02"
ENTRYPOINT [ "/bin/sh" ]
全新构建
# docker build -t demo:0.0.1 . Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM nginx:1.15-alpine
---> 9a2868cac230
Step 2/4 : RUN echo "hello"
---> Running in d301b4b3ed55
hello
Removing intermediate container d301b4b3ed55
---> 6dd2a7773bbc
Step 3/4 : RUN echo "demo best practise"
---> Running in e3084037668e
demo best practise
Removing intermediate container e3084037668e
---> 4588ecf9837a
Step 4/4 : ENTRYPOINT [ "/bin/sh" ]
---> Running in d63f460347ff
Removing intermediate container d63f460347ff
---> 77b52d828f21
Successfully built 77b52d828f21
Successfully tagged demo:0.0.1
Dockerfile 与 1st build 完全一致, 命令仅修改 build tag , 从 0.0.1 到 0.0.2
# docker build -t demo:0.0.2 .Sending build context to Docker daemon 4.096kB
Step 1/4 : FROM nginx:1.15-alpine
---> 9a2868cac230
Step 2/4 : RUN echo "hello"
---> Using cache
---> 6dd2a7773bbc
Step 3/4 : RUN echo "demo best practise"
---> Using cache
---> 4588ecf9837a
Step 4/4 : ENTRYPOINT [ "/bin/sh" ]
---> Using cache
---> 77b52d828f21
Successfully built 77b52d828f21
Successfully tagged demo:0.0.2
可以看到,
这次, 我们将第三层 RUN echo "demo best practise" 变更为 RUN echo "demo best practise 02"
docker build -t demo:0.0.3 .
Sending build context to Docker daemon 4.608kB
Step 1/4 : FROM nginx:1.15-alpine
---> 9a2868cac230
Step 2/4 : RUN echo "hello"
---> Using cache
---> 6dd2a7773bbc
Step 3/4 : RUN echo "demo best practise 02"
---> Running in c55f94e217bd
demo best practise 02Removing intermediate container c55f94e217bd
---> 46992ea04f49
Step 4/4 : ENTRYPOINT [ "/bin/sh" ]
---> Running in f176830cf445
Removing intermediate container f176830cf445
---> 2e2043b7f3cb
Successfully built 2e2043b7f3cb
Successfully tagged demo:0.0.3
可以看到 ,
虽然第四层的操作没有变更,但是由于上层的镜像已经变化了,所以第四层本身也发生了变化。
注意: 每层在 build 的时候都是依赖于上册 ---> Running in f176830cf445。
第四次构建, 这次使用 --no-cache 不使用缓存, 模拟在另一台电脑上进行 build 。
# docker build -t demo:0.0.4 --no-cache . Sending build context to Docker daemon 5.632kB
Step 1/4 : FROM nginx:1.15-alpine
---> 9a2868cac230
Step 2/4 : RUN echo "hello"
---> Running in 7ecbed95c4cdhello
Removing intermediate container 7ecbed95c4cd
---> a1c998781f2e
Step 3/4 : RUN echo "demo best practise 02"
---> Running in e90dae9440c2
demo best practise 02Removing intermediate container e90dae9440c2
---> 09bf3b4238b8
Step 4/4 : ENTRYPOINT [ "/bin/sh" ]
---> Running in 2ec19670cb14
Removing intermediate container 2ec19670cb14
---> 9a552fa08f73
Successfully built 9a552fa08f73
Successfully tagged demo:0.0.4
可以看到,
Dockerfile 以外的功夫
缓存层
FROM
基础层, 以复用在生产场景中的基础镜像。Dockerfile 以内的事项
ADD
和 COPY
时, 尽量不要以 文件夹
作为对象,因为文件夹中变化因子更多。尽可能的将变化频发的文件放在最下层。.dockerignore
忽略不需要的文件,以保证 context
的简洁。原文:https://blog.51cto.com/15061934/2568376