docker学习(十)Dockerfile指令学习

dockerfile指令

dockerfile指令格式

注释: #Commet(#开头)

指令: INSTRUCTION argument (大写指令开头 参数)

1.FROM

FROM  OR FROM :

必须以存在的镜像
基础镜像
必须是第一条非注释指令

2.MAINTAINER

MAINTAINER 

制定作者信息,包含作者的所有者和联系信息

3.RUN

指定镜像中运行的命令.每一个RUN指令都会在当前镜像的上层新建一个镜像

RUN   (shell 模式)

以/bin/sh -c command 的形式执行命令

RUN ["executable","param1","parm2"] (exec 模式)

可以指定其他形式的sh 来运行指令.例:RUN ["/bin/bash","-c","echo hello"]

4.EXPOSE

指定运行该容器所使用的端口

EXPOSE 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  
ADD ["SRC" "SEST"](适用于文件路径中有空格的情况)
COPY  
COPY ["SRC" "SEST"](适用于文件路径中有空格的情况)

来源地址:可以是本地地址,也可以是远程的URL,如果是本地地址,那必须是构建本地的相对地址,
目标地址:镜像中的绝对路径.单纯的复制,推荐使用copy

VOLUME

VOLUME ["/data"]

用来向给予镜像创建的容器添加卷,一个卷是可以存在一个或多个容器的特定目录.这个目录可以绕过联合文件系统.并提供如共享数据,提供数据持久化的功能,

7.设置镜像的目录和文件

WORKDIR

这个指令用来在从镜像创建一个新容器时,在容器内部设置工作目录,ENTERYPOINT或者cmd都会指定在这个目录下执行.我们也可以使用这个指令在构建中为后续的指令指定工作目录.(通常会使用绝对路径,如使用相对路径,呢么工作路径会一直传递下去.)
例子:

WORKDIR /a
WORKDIR b
WORKDIR c
结果:/a/b/c

ENV

用来设置环境变量,环境变量的指令也可以作用于构建过程中以及运行过程中同样有效.
ENV
ENV =...同时设置多个

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(镜像的维护人) "[email protected]" (维护人的联系方式)
ENV REFRESH_DATE 2018-01-01
RUN apt-get update (执行的命令)
RUN apt-get install -y nginx (执行的命令)
EXPOSE 80 (暴露的端口)

查看镜像的构建过程

docker history [image]

例子:

docker history text1

你可能感兴趣的:(docker学习(十)Dockerfile指令学习)