鲁班学院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要小心,因为新构建过程中的上下文在缺少指定的源文件的时候会失败