五、Dockerfile语法梳理

78 阅读2分钟

一、FROM

FROM 关键字一般用于开头,去指定我们要build的image是基于什么image的。

  • FROM scratch
    不基于任何镜像去构建
  • FROM centos
    基于官方的centos去构建

最佳实践: 尽量使用官方的image作为base image
原因很简单:为了安全!!!

二、LABEL

定义了image的mata data
相当于注释,标注作者、image的用途等

三、RUN

经常用的一个关键字,基于base image之上去运行一些命令的时候需要用到这个关键字。
对于image来讲,每运行一次RUN,就会产生新的一层
最佳实践: 为了美观,复杂的RUN请用反斜线换行,避免无用分层,合并多条命令成一行\

15200008-488e9115792ea978.png

最佳实践

四、WORKDIR

设定当前工作目录,相当于在linux中的cd,然后在当前目录下去做事情。\

15200008-0f2210515be64abb.png

WORKDIR


最佳实践:
1,用WORKDIR,不要用RUN cd
2.尽量使用绝对目录,不要使用相对目录

五、ADD COPY

将本地的文件添加到docker的image里面。
区别:ADD不仅可以添加、复制文件,还可以解压缩。\

15200008-f24aee6a05fa92e6.png

ADD COPY


最佳实践:
1,大部分情况,COPY优于ADD
2.ADD除了COPY还有额外功能(解压)
3.添加远程文件/目录请使用curl或者wget

五、ENV

声明一个常量\

15200008-8cecc4c273244050.png

ENV


最佳实践:
尽量使用ENV增加可维护性

六、比较RUN、CMD、ENTRYPOINT

RUN: 执行命令并创建爱你新的image layer
CMD: 设置容器启动后默认执行的命令和参数
ENTRYPOINT: 设置容器启动时运行的命令

1.两种格式

15200008-cab81b1b47e9c0de.png

Shell格式和Exec格式

2.CMD
  • 容器启动时默认执行的命令
  • 如果docker run指定了其他的命令,CMD命令被忽略
  • 如果定义了多个CMD,则只执行最后一个
3.ENTRYPOINT
  • 让容器以应用程序或者服务的形式运行

  • 不会被忽略,一定会执行

  • 最佳实践:写一个shell脚本作为entrypoint

    \

    15200008-fb4ad57d6327fbcf.png

    脚本