Dockerfile手册
Dockerfile的使用方式
build context是一些特定位置的文件的集合,包括PATH或者URL指定的位置。PATH是文件系统上的一个目录。URL则是Git仓库的位置。context是递归处理的,因此PATH会包含其子目录。URL也会包含它的仓库和子模块。例如如下命令就是把当前路径作为context。
$ docker build .
Sending build context to Docker daemon 6.51 MB
...
build命令是由Docker daemon运行的,而不是CLI。因此build进程首先要将整个context(递归地)发给daemon。大部分情况下,你可以将一个空目录作为上下文,该目录中只包含一个Dockfile。然后只将需要加到新镜像中的文件放到该目录中。要保持改目录中的文件尽量少。
警告:不要把根目录“/” 作为构建image的PATH, 这将会把你的整个操作系统磁盘都作为context发给Docker daemon.
如果在docker builder中没有指定,默认情况下,会读取context中的Dockerfile来构建image。也可以通过-f 选项来指定某个位置的某个文件来构建,例如:
$ docker build -f /path/to/a/Dockerfile .
可以指定构建成功后,将新的docker image存放到一个或多个仓库中,或者多个别名和版本,这通过-t选项实现:
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
以上例子是用两个-t,指定多个版本号。
Docker daemon会按顺序依次执行Dockerfile中的指令,每条指令执行完,就commit到新镜像中。全部执行完成后就清理掉发送给Daemon中的Context(不是文件系统上的context,目录中的文件还是在的)。
注意每个指令是独立的,并且会新建一层镜像。因此RUN cd /tmp 这个指令,并不会影响下一条指令。
格式
解析指令(Parser directives)
指令
FROM
指定基础镜像
RUN
在新的层上运行命令。命令运行结果将会创建一个新的image,作为Dockerfile下一步的运行的基础。
RUN指令两种形式:
- RUN <command>
- RUN ["executable", "param1", "param2"]
CMD
一个Dockfile中只有一个CMD是生效的,如果有多个,只有最后一个生效。这个指令的作用是用于指定容器运行时(docker run),默认要执行的命令。
CMD有三种形式:
- CMD ["executable","param1","param2"] (exec form, 这种是推荐的形式)
- CMD ["param1","param2"] (作为 ENTRYPOINT的默认参数)
- CMD command param1 param2 (shell form)