0%

Dockerfile详解

Dockerfile是一种文本文档,其中包含用户在命令行上可以调用的所有命令,使用这些命令来组装Image。

最简单的Dockerfile

1
2
3
4
5
6
7
8
9
#Version: 0.01
FROM anapsix/alpine-java:8 #基于哪个镜像
MAINTAINER reason.h.duan #作者
RUN mkdir /opt/rest_demo #创建一个工作目录,不创建不能上传文件到此目录
ADD RestDemo.jar /opt/rest_demo #上传自己的文件
ADD start.sh /opt/rest_demo
WORKDIR /opt/rest_demo #设置工作目录
ENTRYPOINT ["./start.sh"] #设置容器启动执行脚本

Dockerfile命令详解


FROM

语法:FROM <image>[:<tag>]
解释:设置基于哪个镜像,必须为第一个命令,如果本地不存在,则会从中央仓库自动获取,tag默认获取latest

MAINTAINER

语法:MAINTAINER <name>
解释:用于设置image作者信息

RUN

语法:RUN <command>  #直接运行命令,调用的是/bin/sh -c <command>
      RUN ["shellfile","param1","param2"]   #调用exec执行,有时候需要传参数或者复制业务
解释:RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样。

CMD

语法:CMD <command>
      CMD ["shellfile","param1","param2"]
解释:CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。
注意:RUN和CMD都是执行命令,他们的差异在于RUN中定义的命令会在执行docker build命令创建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。

EXPOSE

语法:EXPOSE <port> [ ...]
解释:EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息。

ENV

语法:ENV <key> <value>
解释:ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env <key>=<value>参数来修改。
注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。

ADD

语法:ADD <src> <dest>
解释:ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,<src>是一个文件或目录的路径,也可以是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,<dest>是目标容器的一个绝对路径
注意:  <src> 必须在Dockerfile同级目录或子目录
        <src> 是本地压缩包,<dest>以/结尾,则会自动解压
        <dest> 必须存在,否则会报错

COPY

语法:COPY <src> <dest>
解释:将本地文件复制到镜像中,不支持url

ENTRYPOINT

语法:ENTRYPOINT ["executable", "param1", "param2"]  #将会调用exec执行,可以通过run时传递参数
      ENTRYPOINT command param1 param2  #调用/bin/sh
解释:ENTRYPOINT指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。
注意:当使用ENTRYPOINT指令时生成的镜像运行时只会执行该指令指定的命令。
      当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当做ENTRYPOINT指令的参数使用,其他情况则会被忽略。
      

VOLUME

语法:VOLUME ["samepath"]
解释:VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移。

USER

语法:USER [username|uid]
解释:USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令。

WORKDIR

语法:WORKDIR /path/to/workdir
解释:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值。

ONBUILD

语法:ONBUILD [INSTRUCTION]
解释:ONBUILD指令用来设置一些触发的指令,用于在当该镜像被作为基础镜像来创建其他镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后被执行,上述介绍的任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。