Dockerfile详解
[toc]
Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。
Docker程序将这些Dockerfile指令翻译真正的Linux命令。
Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。
相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。
有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。
Dockerfile的书写规则及指令使用方法
Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条指令,每条指令可以携带多个参数。
Dockerfile的指令根据作用可以分为两种,构建指令和设置指令。
- 构建指令用于构建image,其指定的操作不会在运行image的容器上执行;
- 设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。
FROM(指定基础image)
构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库。
//指定基础image为该image的最后修改的版本
FROM <image>
//指定基础image为该image的一个tag版本。
FROM <image>:<tag>
MAINTAINER(用来指定镜像创建者信息)
构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
MAINTAINER <name>
MAINTAINER neo xu <[email protected]>
RUN(安装软件使用)
构建指令,RUN可以运行任何被基础image支持的命令。
RUN <command> (the command is run in a shell - `/bin/sh -c`) RUN ["executable", "param1", "param2" ... ] (exec form)
CMD(设置container启动时执行的操作)
设置指令,用于container启动时指定的操作。
- 该操作可以是执行自定义脚本,也可以是执行系统命令。
- 该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
- 当docker run command的命令匹配到CMD command时,会替换CMD执行的命令
//该指令有三种格式:
//独立使用,json格式
CMD ["executable","param1","param2"]
//独立使用,shell格式
CMD command param1 param2 (as a shell)
//Dockerfile指定了ENTRYPOINT
CMD ["param1","param2"]
简而言之,用了ENTRYPOINT,CMD就必须是CMD ["param1","param2"]格式
ENTRYPOINT(设置container启动时执行的操作)
设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。
- 该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。
- 当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。
//独立使用,json格式
ENTRYPOINT ["executable", "param1", "param2"]
//独立使用,shell格式
ENTRYPOINT command param1 param2
//和CMD一起使用
ENTRYPOINT ["executable"]
EXPOSE(指定容器需要映射到宿主机器的端口)
container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:
EXPOSE <port> [<port>...]
# 映射一个端口
EXPOSE port1
# 相应的运行容器使用的命令
docker run -p port1 image
# 映射多个端口
EXPOSE port1 port2 port3
# 相应的运行容器使用的命令
docker run -p port1 -p port2 -p port3 image
# 还可以指定需要映射到宿主机器上的某个端口号
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
ENV(用于设置环境变量)
构建指令,在image中设置一个环境变量。
ENV <key> <value>
设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。 假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写: ENV JAVA_HOME /path/to/java/dirent
ADD(从src复制文件到container的dest路径)
构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果
ADD <src> <dest>
VOLUME(指定挂载点)
VOLUME命令用于让你的容器访问宿主机上的目录。 和shell中的-v一样
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]
WORKDIR(切换目录)
WORKDIR命令用于设置CMD指明的命令的运行目录。
WORKDIR /path/to/workdir