鲁班学院java架构师成长路线
∎ENV
用来给镜像定义所需要的环境变量,并且可以被Dockerfile文件中位于其后的其他指令(如ENV、ADD、COPY等)所调用,调用格式:$variable_name或者${variable_name}
语法:
1ENV
2ENV =...
第一种格式中,
第二种格式可以一次设置多个变量,如果
∎ARG
用法同ENV
语法:
1ARG default value>]
指定一个变量,可以在docker build创建镜像的时候,使用--build-arg来指定参数
∎RUN
用来指定docker build过程中运行指定的命令
语法:
1RUN
2RUN [",","]
第一种格式里面的参数一般是一个shell命令,以/bin/sh -c来运行它
第二种格式中的参数是一个JSON格式的数组,当中是要运行的命令,后面是传递给命令的选项或者参数;但是这种格式不会用/bin/sh -c来发起,所以常见的shell操作像变量替换和通配符替换不会进行;如果你运行的命令依赖shell特性,可以替换成类型以下的格式
∎CMD
容器启动时运行的命令
语法:
1CMD
2CMD [",","]
3CMD [","]
前两种语法和RUN相同
第三种语法用于为ENTRYPOINT指令提供默认参数
RUN和CMD区别:
l RUN指令运行于镜像文件构建过程中,CMD则运行于基于Dockerfile构建出的新镜像文件启动为一个容器的时候
l CMD指令的主要目的在于给启动的容器指定默认要运行的程序,且在运行结束后,容器也将终止;不过,CMD命令可以被docker run的命令行选项给覆盖
l Dockerfile中可以存在多个CMD指令,但是只有最后一个会生效
∎ENTRYPOINT
类似于CMD指令功能,用于给容器指定默认运行程序
语法:
1ENTRYPOINT
2ENTRYPOINT[",","]
和CMD不同的是ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序(但是,docker run命令的--entrypoint参数可以覆盖ENTRYPOINT)
docker run命令传入的参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用
同样,Dockerfile中可以存在多个ENTRYPOINT指令,但是只有最后一个会生效
Dockerfile中如果既有CMD又有ENTRYPOINT,并且CMD是一个完整可执行命令,那么谁在最后谁生效
∎ONBUILD
用来在Dockerfile中定义一个触发器
语法:
1ONBUILD
Dockerfile用来构建镜像文件,镜像文件也可以当成是基础镜像被另外一个Dockerfile用作FROM指令的参数
在后面这个Dockerfile中的FROM指令在构建过程中被执行的时候,会触发基础镜像里面的ONBUILD指令
ONBUILD不能自我嵌套,ONBUILD不会触发FROM和MAINTAINER指令
在ONBUILD指令中使用ADD和COPY要小心,因为新构建过程中的上下文在缺少指定的源文件的时候会失败