FROM
指定base镜像。
FROM <image>或FROM <image>:<tag>
MAINTAINER
设置镜像的作者,可以是任意字符串,使用MAINTAINER指令来为生成的镜像署名作者
MAINTAINER author's name mailaddress
ADD
ADD <src>... <dest>
将文件拷贝到container的文件系统对应的路径下。可以是文件、文件夹、URL,对于文件和文件夹必须是在Dockerfile的相对路径下(build context path),即只能是相对路径且不能包含…/path/。只能是容器中的绝对路径。如果路径不存在则会自动级联创建,根据你的需要是里是否需要反斜杠/,习惯使用/结尾从而避免被当成文件。
另外ADD支持远程URL获取文件,但官方认为是strongly discouraged,建议使用wget或curl代替。ADD还支持自动解压tar文件,比如ADD trusty-core-amd64.tar.gz /会线自动解压内容再COPY到在容器的/目录下。ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载,也就是你不能在运行时通过这种方式向容器中传送文件,-v选项映射本地到容器的目录
示例:
# 支持模糊匹配
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character
ADD requirements.txt /tmp/
RUN pip install /tmp/requirements.txt
ADD . /tmp/
COPY
Writing Dockerfiles建议尽量使用COPY,并使用RUN与COPY的组合来代替ADD,这是因为虽然COPY只支持本地文件拷贝到container,但它的处理比ADD更加透明,建议只在复制tar文件时使用ADD,如ADD trusty-core-amd64.tar.gz /。
用法:
COPY src dest
COPY ["src", "dest"]
ENV
用于设置环境变量:
ENV <key> <value>
设置了后,后续的RUN命令都可以使用,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加-env =参数来修改。
EXPOSE
EXPOSE指令告诉容器在运行时要监听的端口,但是这个端口是用于多个容器之间通信用的(links),外面的host是访问不到的。要把端口暴露给外面的主机,在启动容器时使用-p选项。示例:
EXPOSE 11211 11212
VOLUME
VOLUME指令用来在容器中设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移。
WORKDIR
WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /a,WORKDIR b,RUN pwd最终输出的当前目录是/a/b。(RUN cd /a/b,RUN pwd是得不到/a/b的)
RUN
RUN <commnad>
RUN ["executable", "param1", "param2"]
RUN指令会在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像,提交的镜像会在后面继续用到。
上面看到RUN后的格式有两种写法。shell格式,相当于执行/bin/sh -c “”:
示例:
RUN apt-get install vim -y
RUN ["apt-get", "install", "vim", "-y"]
RUN ["/bin/bash", "-c", "apt-get install vim -y"] # 与shell风格相同
CMD
CMD ["executable","param1","param2"] (数组/exec格式)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell格式)
一个Dockerfile里只能有一个CMD,如果有多个,只有最后一个生效。CMD指令的主要功能是在build完成后,为了给docker run启动到容器时提供默认命令或参数,这些默认值可以包含可执行的命令,也可以只是参数(此时可执行命令就必须提前在ENTRYPOINT中指定)。它与ENTRYPOINT的功能极为相似,区别在于如果docker run后面出现与CMD指定的相同命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外CMD还可以单独作为ENTRYPOINT的所接命令的可选参数。
ENTRYPOINT
ENTRYPOINT命令设置在容器启动时执行命令,如果有多个ENTRYPOINT指令,那只有最后一个生效。有以下两种命令格式:
ENTRYPOINT ["executable", "param1", "param2"] 数组/exec格式,推荐或
ENTRYPOINT command param1 param2 shell格式
使用exec格式,在docker run 的所有参数,都会追加到ENTRYPOINT之后,并且会覆盖CMD所指定的参数(如果有的话)。当然可以在run时使用–entrypoint来覆盖ENTRYPOINT指令。使用shell格式,ENTRYPOINT相当于执行/bin/sh -c <command…>,这种格式会忽略docker run和CMD的所有参数。
以推荐使用的exec格式为例:我们可以使用ENTRYPOINT来设置基本不会变化的命令,用CMD来设置其它的可能改变的默认启动命令或选项(docker run会覆盖的)。
FROM ubuntu
ENTRYPOINT ["top", "-b"]CMD ["-c"]
容器命令优先级(从高到低):
- docker run --entrypoint
- Dockerfile中的ENTRYPOINT
- docker run cmd
- Dockerfile中的CMD