(1)FROM
FROM <imageName>
FROM <imageName>:<tag>
imageName必须是已存在的镜像。
FROM必须是第一条非注释的指令。
(2)MAINTAINER
MAINTAINER <name>
指定镜像的作者信息,包含镜像的所有者和联系信息
(3)RUN
指定当前镜像中运行的命令
RUN <command> (shell 模式)
//RUN echo hello
RUN ["executable", "param1", "param2"] (exec模式)
//RUN ["/bin/bash", "-c", "echo hello"]
(4)EXPOSE
指定运行时给镜像的容器使用的端口,可以指定一个或多个
EXPOSE <port>[<port>...]
dockerfile中使用EXPOSE指定的端口,告诉docker该容器中的应用程序会使用特定的端口,但是出于安全,docker并不会自动打开端口,需要在使用时,在启动容器的run命令中使用-p添加对端口的映射指令。
(5)CMD
CMD <command> (shell 模式)
//CMD echo hello
CMD ["executable", "param1", "param2"] (exec模式)
//CMD ["/bin/bash", "-c", "echo hello"]
CMD ["param1", "param2"](作为ENTRYPOINT指令的默认参数)
和RUN指令相同的是,CMD也是指定一个运行俄命令。
不同的是,RUN指定的命令是在容器构建的时候运行的,CMD指定的指令是在容器运行时候执行的。
如果使用命令行的docker run
命令后面带有命令(如:/bin/bash),此命令将会覆盖CMD指定的命令,使得CMD命令不会执行,而不会覆盖RUN指定的命令。
(6)ENTRYPOINT
ENTRYPOINT <command> (shell 模式)
//ENTRYPOINT echo hello
ENTRYPOINT ["executable", "param1", "param2"] (exec模式)
//ENTRYPOINT ["/bin/bash", "-c", "echo hello"]
ENTRYPOINT和CMD不同之处在于,ENTRYPOINT指定的命令不会被docker run指定的命令所覆盖(执行ENTRYPOINT
命令,docker run
指定的命令不会执行),如果想被覆盖,可以使用docker run --entrypoint
选项。
ENTRYPOINT和CMD组合使用:
使用ENTRYPOINT指定命令,使用CMD指定命令默认的参数。这样使用,在运行docker run
时候,只需要使用指定的参数去覆盖CMD指定的默认参数即可。
(7)ADD和COPY
将文件或目录复制到dockerfile构建的镜像中。
ADD <src>... <dest>
ADD ["<src>".. "<dest>"] :适用于文件路径中有空格的情况
COPY <src>... <dest>
COPY ["<src>".. "<dest>"] :适用于文件路径中有空格的情况
src:来源可以是本地地址,也可以是远程的URL。如果是本地地址,必须是构建目录中的想对地址。远程的URL不推荐使用。
dest:目标路径,需要指定镜像中的绝对路径。
ADD和COPY区别:
ADD包含类似于tar的解压功能,如果是单纯复制文本,docker推荐使用copy。
(8)VOLUME
VOLUME ["/data"]
用来向基于镜像创建的容器添加卷,一个卷可以是存在于一个或多个容器的特定目录,这个目录可以绕过联合文件系统并提供如共享数据、对数据持久化的功能。
(9)WORKDIR
当从镜像创建新容器时,在容器中创建工作目录。ENTRYPOINT和CMD指定的命令将会在这个目录下执行。
通常使用绝对路径。如果使用想对路径,路径将会一直向下传递。
WORKDIR /path/to/workdor
(10)ENV
用于设置环境变量,构建过程和运行过程同样有效。
ENV <key> <value>
ENV <key>=<value> ...
(11)USER
指定镜像会以什么样的用户去运行。不指定的情况下会默认root用户。
//启动的容器将会以uid用户的身份去运行
USER uid
USER uid:gid
(12)ONBUILD
为镜像添加触发器。当一个镜像被用作其他镜像的基础镜像时,这个触发器会被执行。当子镜像在构建时会插入触发器指令。
ONBUILD [INSTRUCTION]
如:dockerfileA文件中有ONBUILD指令。我们首先使用dockerfileA构建镜像images1,此时ONBUILD指定的指令不会执行。在images1启动的容器中将无法看到ONBUILD的执行结果。
此时我们使用images1为基础镜像创建dockerfileB文件,并使用dockerfileB构建镜像images2,此时dockerfileA中ONBUILD指定的指令将会执行。在images2启动的容器中将无法看到ONBUILD的执行结果。