Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工 作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
Dockerfile一般由一条条语句组成,并支持以 # 开头的注释行
一般来说Dockerfile分为四部分
部分 | 命令 |
---|---|
基础镜像信息 | FROM |
维护者信息 | MAINTAINER |
镜像操作指令 | RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等 |
容器启动时执行指令 | CMD、ENTRYPOINT |
Dockerfile的基本指令及其用法:
FROM | 指定哪种镜像作为新镜像的基础镜像 | FROM <image> |
MAINTAINER |
指明该镜像的作者和其电子邮件 | MAINTAINER <name> <email> |
RUN |
在新镜像内部执行的命令,比如安装一些软件、配置 一些基础环境,可使用\来换行 |
RUN "command" "param1" "param2" |
CMD |
容器启动时需要执行的命令 | CMD command param1 param2 |
EXPOSE |
暴露镜像的端口供主机做映射,启动镜像时,使用 -P参数来讲镜像端口与宿主机的随机端口做映射。 |
EXPOSE <port> [<port>...] |
ENV | 设置容器的环境变量 | EVN <key> <value> |
ADD | 将主机的文件复制到镜像中 | ADD <src> <dest> |
COPY | 将主机的文件复制到镜像内,如果目的位置不存在, Docker会自动创建所有需要的目录结构,但是它只是单纯的复制, 并不会去做文件提取和解压工作。 |
COPY <src> <dest> |
ENTRYPOINT | 用法和CMD命令一样 | ENTRYPOINT "command" "param1" "param2" |
VOLUME | 用来向基于镜像创建的容器添加卷。 | VOLUME ["path"] |
USER | 指定该镜像以什么样的用户去执行 | USER daemon |
WORKDIR | 在构建镜像时,指定镜像的工作目录 | WORKDIR path |
ONBUILD | 当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。 | ONBUILD [INSTRUCTION] |
FROM
用法:FROM <image>
说明:第一个指令必须是FROM了,其指定一个构建镜像的基础源镜像,如果本地没有就会从公共库中拉取,没有指定镜像的标签会使用默认的latest标签,可以出现多次,如果需要在一个Dockerfile中构建多个镜像。
MAINTAINER
用法:MAINTAINER <name> <email>
说明:描述镜像的创建者,名称和邮箱
RUN
用法:RUN "command" "param1" "param2"
说明:RUN命令是一个常用的命令,执行完成之后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就 是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN 命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用 shell的,所以也不会继承相应变量,要查看输入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。
CMD
用法:CMD command param1 param2
说明:CMD在Dockerfile中只能出现一次,有多个,只有最后一个会有效。其作用是在启动容器的时候提供一个默认的命令项。如果用户执行docker run的时候提供了命令项,就会覆盖掉这个命令。没提供就会使用构建时的命令。
EXPOSE
用法:EXPOSE <port> [<port>...]
说明:告诉Docker服务器容器对外映射的容器端口号,在docker run -p的时候生效。
ENV
用法:EVN <key> <value> 只能设置一个
EVN <key>=<value>允许一次设置多个
说明:设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。
ADD
用法:ADD <src> <dest>
说明:复制本机文件或目录或远程文件,添加到指定的容器目录,支持GO的正则模糊匹配。路径是绝对路径,不存在会自动创建。如果源是一个目录,只会复制目录下的内容,目录本身不会复制。ADD命令会将复制的压缩文件夹自动解压,这也是与COPY命令最大的不同。
COPY
用法:COPY <src> <dest>
说明:COPY除了不能自动解压,也不能复制网络文件。其它功能和ADD相同。
ENTRYPOINT
用法:ENTRYPOINT "command" "param1" "param2"
说明:这个命令和CMD