#逐步介绍 Dockerfile里的命令

ENV

格式: ENV <key> <val> 或 ENV <key>=<val> ...

ENV指令可以为镜像创建出来的容器声明环境变量,可被后边的指令解释使用,
使用格式为 $variable_name${variable_name}。如果是带$的字符串,可使用\来转义。

FROM

格式: FROM <image>FROM <image>:<tag>

FROM指令为后边的指令提供基础镜像

COPY

格式: COPY <src> <dest>

COPY指令复制<src>所指向的文件或目录,将它添加到新镜像中,src所指向的源必须在上下文中。

context上下文: 当构建镜像时,会执行 docker build PATH|-|URL命令,最后的PATH|-|URL即为上下文环境,在构建过程中,
docker程序会将指定目录的所有文件(可用.dockerignore文件来忽略文件)复制到构建环境(实际是由docker-client提交到daemon去构建镜像),这些文件作为构建镜像的上下文。

可同时拷贝多个文件,如 COPY src1 src2 workdir/,如果src1,src2是目录,则执行时会将src1,src2两个目录下的文件复制到 workdir/中去。

ADD

格式:ADD <src> <dest>
ADDCOPY 功能上很相似,都支持将本地文件复制到镜像中,但ADD还支持其他功能,
src可以是一个指向网络文件的 URL,此时若dest指向目录,则URL必须是完全路径;还可以是本地压缩归档文件,该文件复制到容器时会被解压提取,但URL中的归档文件不会被解压。

推荐使用COPY,相比之下它更透明

RUN

两种格式:

  1. RUN <command> shell格式
  2. RUN ["exec","param1","param2"] exec格式

RUN命令会在前一条命令创建的镜像基础上创建一个容器,并在容器中运行命令,在命令结束后提交容器为新镜像,新镜像被Dockerfile中的下一条指令使用。

当使用shell格式,时,命令通过 /bin/sh -c运行,当使用exec格式时,命令是直接运行的,exec中参数会被当成json数组解析,因此必须使用双引号。因为其不在shell中执行,因此环境变量不会被替换。如果希望运行shell程序,可写成CMD ["sh","-c","progress"]

CMD

三种格式:

  1. CMD <command> shell格式
  2. CMD ["exec","param1","param2"] exec格式,推荐
  3. CMD ["param1","param2"] 为ENTRYPOINT指令提供参数

可以有多条CMD命令,但只有一条会被执行。前两种执行方式一致,但执行时机不通:RUN 是在构建过程中执行命令并生成新镜像,CMD 在构建时不执行而是在容器启动时作为第一条命令执行。
使用第三种格式时,会将值作为参数传给ENTRYPOINT指令

ENTRYPOINT

两种格式:

  1. ENTRYPOINT <command> shell格式
  2. ENTRYPOINT ["exec","param"] exec格式,推荐

ENTRYPOINTCMD命令类似,都可以让容器在启动时执行相同的命令,但又有区别。ENTRYPOINT指令可以有多条,但只有最后一条有效,当使用shell格式时,
会忽略所有CMD指令和docker run参数,并运行在 /bin/sh -c中,这意味着该指令进程是 /bin/sh -c的子进程,在容器中的PID将不再是1,且不能接受UNIX信号,即使使用docker stop命令,也收不到SIGTERM信号。

ONBUILD

格式: ONBUILD [INSTRUCTION]

添加一个将来执行的触发器指令到镜像中,当该镜像作为FROM指令的参数时,这些触发器指令就会在FROM指令执行时假如到构建过程中。