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>

是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;

是container中的绝对路径

VOLUME(指定挂载点)

VOLUME命令用于让你的容器访问宿主机上的目录。 和shell中的-v一样

# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

WORKDIR(切换目录)

WORKDIR命令用于设置CMD指明的命令的运行目录。

WORKDIR /path/to/workdir

results matching ""

    No results matching ""