1.0 Dockerfile的常用指令
Dockerfile 由一行行命令语句组成,并且支持以 #
开头的注释行。Dockerfile 的内容分为四个部分:
基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令
指令的一般格式为
指令名称 参数
1.1.0 FROM
⽀持三种格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM
指令必须指定且需要在Dockerfile
其他指令的前⾯,指定的基础image 可以是官⽅远程仓库中的,也可以位于本地仓库。后续的指令都依赖于该指 令指定的image。当在同⼀个Dockerfile中建⽴多个镜像时,可以使⽤多个 FROM指令。
比如:
# 基于哪个镜像
FROM java:8
1.2.0 MAINTAINER
格式:
- MAINTAINER
指定维护者
1.3.0 LABEL
为镜像添加元数据标签,一个 LABEL
就是一个键值对。
LABEL maintainer="qaz" version="1.0"
新添加的
LABEL
和已有的LABEL
同名,则新值会覆盖掉旧值。
1.30 ENV
指令格式
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>
指定环境变量,会被后续RUN指令使⽤,并在容器启动后,可以通 过 docker inspec
t 查看这个环境变量,也可以通过 docker run --env =
来修改环境变量
例子:
ENV JAR_PATH '/home/soft/workspace/demo-study-1.0.0-SNAPSHOT.jar'
1.4.0 RUN
⽀持两种格式:
- shell指令格式:
RUN <command>
# 打印目录
RUN pwd && ll
exec
格式
# 使用exec执行
RUN ["executable", "param1", "param2"]
也可指定其它终端。例如:
RUN ["/bin/bash", "-c", "echo hello"]
,该⽅式必须使⽤["]⽽不能使⽤['], 因为该⽅式会被转换成⼀个JSON 数组;所以将多个命令通过&&
合并到同一个RUN
指令上,避免镜像新建层,过大
1.5.0 CMD
格式有三种:
-
shell :
CMD <shell command>
-
exec 命令格式:
CMD ["executable","param1","param2"]
-
该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
CMD ["<param1>","<param2>",...]
作用:为启动的容器指定要运行的命令,类似于 RUN 指令,但 CMD 运行程序的时间是在 docker run 时执行的,命令运行结束,容器也就结束。
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]
CMD指令的主要⽬的是为执⾏容器提供默认值。每个Dockerfile只有⼀个 CMD命令,如果指定了多个CMD命令,那么只有⼀条会被执⾏,如果启动容 器的时候指定了运⾏的命令,则会覆盖掉CMD指定的命令。
1.6.0 EXPOSE
为Docker容器暴露对外的端⼝号
EXPOSE <port1> [<port2> ...]
1.7.0 ADD
格式:
ADD <src> <dest>
ADD ["",... ""]
从src⽬录复制⽂件到容器的dest。其中src可以是Dockerfile所在⽬录的相对 路径,也可以是⼀个URL,还可以是⼀个压缩包
注意:
- src必须在构建的上下⽂内,不能使⽤例如: ADD …/somethine /something ,因为 docker build 命令⾸先会将上下⽂路径和其⼦⽬ 录发送到docker daemon
- 如果src是⼀个URL,同时dest不以斜杠结尾,dest将会被视为⽂件,src 对应内容⽂件将会被下载到dest
- 如果src是⼀个URL,同时dest以斜杠结尾,dest将被视为⽬录,src对应 内容将会被下载到dest⽬录
- src是⼀个⽬录,那么整个⽬录其下的内容将会被拷⻉,包括⽂件系 统元数据
- ⽂件是可识别的压缩包格式,则docker会⾃动解压
1.8.0 COPY
COPY 指令非常简单,仅用于将文件拷贝到镜像中,而 ADD 相对来讲复杂一些,可以用于下载远程文件以及解压压缩包。所以除非要解压缩包,否则建议使用 COPY;
复制本地端的src到容器的dest。和ADD指令类似,COPY不⽀持URL和压缩包。
1.9.0 VOLUME
格式为: VOLUME ["/data"]
使容器中的⼀个⽬录具有持久化存储数据的功能,该⽬录可以被容器本身使 ⽤,也可以共享给其他容器。当容器中的应⽤有持久化数据的需求时可以在 Dockerfile中使⽤该指令。
作用:
- 避免重要的数据,因容器重启而丢失
- 避免容器不断变大
1.10.0 WORKDIR
WORKDIR
指令可以设置默认目录,也就是运行 RUN / CMD / ENTRYPOINT
指令的地方。
格式为: WORKDIR /path/to/workdir