深入Dockerfile
前言
博主语录:一文精讲一个知识点,多了你记不住,一句废话都没有
经典语录:一厢情愿,就得愿赌服輸
一、命令说明
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般而言,Dockerfile可以分为四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 启动时执行指令
二、FROM
FROM 指定基础镜像,最好挑一些 apline , slim 之类的基础小镜像
scratch 镜像是一个空镜像,常用于多阶段构建
如何确定我需要什么要的基础镜像?
- Java应用当然是java基础镜像(SpringBoot应用)或者Tomcat基础镜像(War应用)
- JS模块化应用一般用nodejs基础镜像
- 其他各种语言用自己的服务器或者基础环境镜像,如python、golang、java、php等
三、LABEL
标注镜像的一些说明信息。
LABEL multi.label1="value1" multi.label2="value2" other="value3" LABEL multi.label1="value1" \ multi.label2="value2" \ other="value3"
四、RUN
- RUN指令在当前镜像层顶部的新层执行任何命令,并提交结果,生成新的镜像层。
- 生成的提交映像将用于Dockerfile中的下一步。 分层运行RUN指令并生成提交符合Docker的核心概念,就像源代码控制一样。
- exec形式可以避免破坏shell字符串,并使用不包含指定shell可执行文件的基本映像运行RUN命令。 可以使用SHELL命令更改shell形式的默认shell。 在shell形式中,您可以使用\(反斜杠)将一条RUN指令继续到下一行。
RUN <command> ( shell 形式 , /bin/sh - c 的方式运行,避免破坏 shell 字符串 ) RUN ["executable", "param1", "param2"] ( exec 形式 )
RUN /bin/bash -c 'source $HOME/.bashrc; \ echo $HOME' # 上面等于下面这种写法 RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME' RUN ["/bin/bash", "-c", "echo hello"]
# 测试案例 FROM alpine LABEL maintainer=leifengyang xx=aa ENV msg='hello atguigu itdachang' RUN echo $msg RUN ["echo","$msg"] RUN /bin/sh -c 'echo $msg' RUN ["/bin/sh","-c","echo $msg"] CMD sleep 10000 # 总结; 由于 [] 不是 shell 形式,所以不能输出变量信息,而是输出 $msg 。其他任何 /bin/sh -c 的形式都可以输出变量信息 总结:什么是shell和exec形式