dockerfile指令
dockerfile指令格式
注释: #Commet(#开头)
指令: INSTRUCTION argument (大写指令开头 参数)
1.FROM
FROM <IMAGE> OR FROM <IMAGE>:<TAG>
必须以存在的镜像
基础镜像
必须是第一条非注释指令
2.MAINTAINER
MAINTAINER <NAME>
制定作者信息,包含作者的所有者和联系信息
3.RUN
指定镜像中运行的命令.每一个RUN指令都会在当前镜像的上层新建一个镜像
RUN <COMMAND> (shell 模式)
以/bin/sh -c command 的形式执行命令
RUN ["executable","param1","parm2"] (exec 模式)
可以指定其他形式的sh 来运行指令.例:RUN ["/bin/bash","-c","echo hello"]
4.EXPOSE
指定运行该容器所使用的端口
EXPOSE <port>or[port...]
容器运行时还是要去在使用时在run 命令中添加对端口的使用
5.容器运行时运行的命令
CMD
用来提供容器运行的默认命令,与RUN指令类似,都是执行一个命令,但是RUN指令指定的命令实在镜像构建的时候运行的.而cmd指定的命令是在容器运行的时候运行的.并且当我们使用docker run命令启动一个容器的时候,如果制定了容器运行的命令,那么CMD当中的指令会被覆盖,不会执行.也就是说:cmd是用来指定容器的默认行为.
CMD ["executable","param1","parm2"] (exec模式)
CMD command param1 param2 (shell模式)
CMD ["param1","parm2"] (作为ENTRYPOINT指令的默认参数)
例子:
CMD ["/usr/sbin/nginx","-g","deamon off"]
ENTERYPOINT
(不会被docker run 命令中的启动命令所覆盖,如果需要覆盖的话可以使用:docker run --entrypoint 覆盖)
例子:
ENTERYPOINT ["/usr/sbin/nginx","-g","deamon off"]
组合使用的方式
用ENTERYPOINT指定命令,用CMD指定参数
这时候可以在docker run 中指定参数
6.设置镜像的目录和文件
ADD
COPY
都是将文件复制到使用dockerfile构建的镜像中,都支持两种参数,来源地址和目标地址.
ADD <SRC> <DEST>
ADD ["SRC" "SEST"](适用于文件路径中有空格的情况)
COPY <SRC> <DEST>
COPY ["SRC" "SEST"](适用于文件路径中有空格的情况)
来源地址:可以是本地地址,也可以是远程的URL,如果是本地地址,那必须是构建本地的相对地址,
目标地址:镜像中的绝对路径.单纯的复制,推荐使用copy
VOLUME
VOLUME ["/data"]
用来向给予镜像创建的容器添加卷,一个卷是可以存在一个或多个容器的特定目录.这个目录可以绕过联合文件系统.并提供如共享数据,提供数据持久化的功能,
7.设置镜像的目录和文件
WORKDIR
这个指令用来在从镜像创建一个新容器时,在容器内部设置工作目录,ENTERYPOINT或者cmd都会指定在这个目录下执行.我们也可以使用这个指令在构建中为后续的指令指定工作目录.(通常会使用绝对路径,如使用相对路径,呢么工作路径会一直传递下去.)
例子:
WORKDIR /a
WORKDIR b
WORKDIR c
结果:/a/b/c
ENV
用来设置环境变量,环境变量的指令也可以作用于构建过程中以及运行过程中同样有效.
ENV <KEY> <VALUE>
ENV <KEY>=<VALUE>...同时设置多个
USER
用来指定镜像会以什么样的用户取运行.
USER DEAMON
例子:
USER nginx//基于该镜像启动的容器就会以nginx的身份来运行
我们也可以在USER命令中使用 uid ,用户组,gid,这四种的任意组合.如果不使用USER命令,默认会使用root用户.
8.ONBUILD
能够为镜像添加触发器:当一个镜像被其他镜像作为基础镜像时执行.当子镜像构建时会插入触发器当中的指令.
ONBUILD [INSTRUCTION]
例子:
ONBUILD COPY index.html /user/share/nginx/html/
Dockerfilef构建过程
创建的过程
1.从基础镜像运行一个容器。
2.执行一条指令,对容器做出修改。
3.执行类似docker commit的操作,提交一个新的镜像层。
4.根据新的镜像层运行一个新的容器。
5.执行dockerfile的下一条指令,直至所有的指令执行完毕。
创建过程特点
会删除中间层创建的容器,不会删除中间层创建的镜像。
这就使我们可以使用中间层镜像进行调试。(可以使我们逐一排查错误产生的位置)
构建缓存
由于每一步的构建结果都会提交为镜像。所以,docker的构建过程就可以非常的聪明,他会将之前的镜像看做缓存。这就可以使构建的过程非常的高效。
这时,如果吧之前构建镜像的步骤再执行一遍的话,就没有以前那么缓慢。同时,会显示Using cache(使用了缓存)的字样。
不使用缓存
方法一:
--no-cache选项不使用缓存
docker build --no-cache
方法二:
第三个命令处使用环境变量 ENV REFRESH_DATE 2018-01-01,来标识缓存刷新的时间,修改这个命令,就可以保证后面的缓存刷新。
#First Dockerfile
FROM ubuntu:14.04(镜像的基础)
MAINTAINER zhiyuan(镜像的维护人) "zhiyuan@outlook.com" (维护人的联系方式)
ENV REFRESH_DATE 2018-01-01
RUN apt-get update (执行的命令)
RUN apt-get install -y nginx (执行的命令)
EXPOSE 80 (暴露的端口)
查看镜像的构建过程
docker history [image]
例子:
docker history text1
网友评论