Dockerfile就像一道“圣旨”,任何人拿着这份文件执行docker build 都会生成相同功能的镜像。Dockerfile就是一份自动化的linux命令集。
- 命名:文件默认为Dockerfile,如果有多个可以命名为Dockerfile.second ,构建时-f 文件名即可
- 整个构建过程“自动化”
- 遇到几个命令连在一起用“\&&”连接,如:
RUN echo 'a' \
&& echo 'b'
官方书写文档 - //注释
- 结构一般形如“指令 参数”,指令一般大写,如 INSTRUCTION arguments
- FROM <imagesName:tag>
FROM指令表示将要构建的镜像来自哪个镜像,FROM指令必须是整个Dockerfile第一句有效指令 - MAINTALNER Name <Email>
这个指令主要是指定维护者信息,方便他人寻找作者 - RUN echo helloWorld
shell格式,这条指令用来在Docker的编译环境中运行指定命令。
RUN ["程序名","参数1","参数2"]
exec格式,需要转义参数中的引号,不会触发shell,所以$HOME这样的环境变量无法使用
RUN指令会在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像,提交的镜像会在后面继续用到 - ENV <key><value>
ENV指令用来指定在执行docker run命令运行时,自动设置的环境变量。这个环境变量可以在后续任何RUN指令中使用,并在容器运行时保持,而且可以通过docker run命令的-e参数来修改环境变量。例如:ENV TARGET_DIR /app
WORKDIR $TARGET_DIR - COPY /local/Path/File /images/Path/File
COPY指令用来将本地的文件或文件夹复制到镜像的指定路径下。 - ADD File /images/Path/File
ADD latest.tar.gz /var/www/
ADD指令可以从一个URL地址下载内容复制到容器的文件系统中,还可以将压缩打包格式的文件解开后复制到指定位置。ADD只能对当前目录或上下文的文件进行操作 - EXPOSE <端口> [<端口>……]
EXPOSE指令用于标明这个镜像中的应用将会侦听某个端口,并且希望能将这个端口映射到主机的网络界面上。但是为了安全,docker run命令如果没有带上响应的端口映射多;数,Docker并不会将端口映射出去。
此外EXPOSE端口是可以在多个容器之间通信用(links) ,通过--links 参数可以让多个容器通过端口连接在一起。 - CMD ["executable", "param1", "param2"]
设置镜像启动时执行的cmd命令
CMD提供了容器默认的执行命令。Dockerfile 只允许使用一次CMD指令。使用多 个CMD会抵消之前所有的指令,只有最后一个指令生效。-般来说这是整个Dockerfile脚本的最后一条指令。 当Dockerfle已经完成了所有环境的安装与配置,通过CMD指令来指示docker run命令运行镜像时要执行的命令。
值得注意的是,docker run命令可以覆盖CMD命令。CMD与ENTRYPOINT的功能极为相似。区别在于:如果dockerrun后面出现与CMD指定的相同的命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外,CMD指令还可以单独作为ENTRYPOINT指令的可选参数,共同组合成一条完整的启动命令。如:CMD ["echo", "Hello Ubuntu"] - VOLUME ["/data","/data2"]
VOLUME /data
设置数据的VOLUME指令 - USER user
- USER user:group
USER uid:gid
设置构建用户的user指令 - WORKDIR /path/to/workdir
设置工作目录的WORKDIR指令 - FROM busybox
ONBUILD RUN echo "a"
设置二次构建指令的ONBUILD指令 - LABEL multi. label1="value1" multi. label2="value2" other="value3"或
LABEL multi. labell="value1" \
multi. label2="value2" \
other="value3"
设置元数据的LABEL指令 - 设置构建变量的ARG指令
- 设置停止信号的STOPSIGNAL指令
- 检查镜像状态的HEALTHCHECK指令
- 设置命令执行环境的SHELL指令 书P106
Comments NOTHING