FROM
尽量使用官方的image作为base image
LABEL
很像代码里的注释,Metadata不可少
RUN
注意每运行一次RUN在image里面都会生成一个新层,为了美观,复杂的RUN请用反斜线换行!避免无用分层,合并多条命令成一行!
WORKDIR
用WORKDIR,不要用RUN cd!尽量使用绝对目录!
ADD和COPY
大部分情况,COPY优于ADD!ADD除了COPY还有额外功能(解压)!添加远程文件/目录请使用curl或者wget。
ENV
尽量使用ENV增加可维护性!
RUN vs CMD vs ENTRYPOINT
- RUN:执行命令并创建新的Image Layer
- CMD:设置容器启动后默认执行的命令和参数
- ENTRYPOINT:设置容器启动时运行的命令
CMD
- 容器启动时默认执行的命令
- 如果docker run指定可其他命令,CMD命令被忽略
- 如果定义可多个CMD,只有最后一个会执行
ENTRYPOINT
- 让容器以应用程序或者服务的形式运行
- 不会被忽略,一定会执行
- 最佳实践:写一个shell脚本作为entrypoint