学会写dockerfile是我们学习docker的必经之路;在写dockerfile的时候,感觉如下命令还是需要做个记录,以备需要时方便查阅参考, 同时本着共享精神,分享笔记内容如下:
----------------------------------------------------------------------------------------------
RUN:
这个指令是在dockcer build 的时候执行的,执行的结果会commit到新的image中;常用于一次性操作,比如目标image中需要安装软件,那么用RUN这个指令;
ADD和COPY:
这个指令也是docker build的时候执行的,要注意的是:如果src是local的压缩/打包文件,比如tar, zip,bzip2,tar.gz ... , 那么会自动在目标目录解压缩,也就是unpack操作;但是如果src不是本地的文件(比如URL指定的文件),那么不会自动自动的解压等;
COPY:
这个指令也是docker build的动作,但是和ADD不同的是,对于archive的处理: copy 会保证文件原来的格式,不会进行unpack的操作,而ADD对本地的文件会进行unpack.
注意ADD, COPY的区别在于对archive的处理模式不同,前者会进行unpack操作,而后者则不会,但是如果source不是本地archive,那么都不会进行unpack.
ARG和ENV:
这个指令用于添加环境变量,可以设置默认值,也可以没有默认值;
通过此方法设置的变量仅仅在docker build的时候生效,而在docker run的时候并不会生效;
如果在docker build的时候,指定了相同参数并赋值,那么会替代ARG指令所指定的参数值;
如果docker build的时候指定的参数没有通过ARG指令进行指定,那么会有WARNING信息输出;
在dockerfile中,只有ARG指令之后的行 ,对变量的引用才会用遵循ARG定义的变量;
虽然ARG指令指定的参数在docker run的时候不可见,但是在docker history 中依然可见,所以不要用ARG传递敏感信息,比如密码等;
ENV: 该指令也用于指定环境变量,该环境变量既在docker build的时候生效,也在docker run的时候生效;ENV的变量是持久存在的,如果在docker run的时候通过env参数进行指定,那么指定的值会替换dockerfile中定义的值;如果在dockerfile中没有定义,那么通过env参数使用依然不会有任何报错和警告;
当ENV和ARG有相同名字的时候,在docker build的时候,ENV的环境变量值会overwrite ARG指定的环境变量值
ONBUILD:
这个指令用于创建一个触发器,ONBUILD后面可以跟任意的 "构建image相关的指令",比如RUN,ARG,ENV...
onbuild既然是一个触发器指令,那么触发条件是什么呢?当用该docker file 构建的image 作为base image的时候,新的image build的时候就会触发,该指令就像插入在FROM 之后一样会立即得到执行;
本文属于笔记整理类的,比较基础,希望能够帮到你。
本文原创,转载请注明出处
网友评论