美文网首页
docker学习(十)Dockerfile指令学习

docker学习(十)Dockerfile指令学习

作者: 吃猫的鱼0 | 来源:发表于2018-02-02 11:22 被阅读0次

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

相关文章

  • docker学习(十)Dockerfile指令学习

    dockerfile指令 dockerfile指令格式 1.FROM 必须以存在的镜像基础镜像必须是第一条非注释指...

  • Docker命令 & DockerFile

    记录一下Docker的常见命令和DockerFile的指令。 1. Docker命令 学习https://www....

  • Docker

    Docker 简介 Docker 可以从 Dockerfile 中读取指令自动构建镜像。Dockerfile 是一...

  • Dockerfile笔记

    最近实验室项目需要使用Docker镜像部署安装tensorflow,为理解其原理,学习了Dockerfile指令相...

  • Dockerfile最佳实践

    Dockerfile 简介 Docker通过读取Dockerfile文件中的指令自动构建镜像。Dockerfile...

  • docker-基础命令和使用案例

    Docker基础命令 Dockerfile指令 编写Dockerfile原则 1.减少镜像层:一次RUN指令形成新...

  • 2020-05-18 Dockerfile

    1. Dockerfile格式 2. Dockerfile指令 3. Build镜像 Usage: docker ...

  • Docker——初级学习

    Docker——初级学习 标签:docker 学习内容 学习镜像、容器和虚拟机的区别 学习使用Dockerfile...

  • Docker学习(8) 生产环境的多阶段构建

    Docker学习(8) 生产环境的多阶段构建 多阶段构建方式使用一个Dockerfile,其中包含多个FROM指令...

  • docker-02

    10:自动制作docker镜像 镜像: 中药 dockerfile: 配方 dockerfile常用指令 根据do...

网友评论

      本文标题:docker学习(十)Dockerfile指令学习

      本文链接:https://www.haomeiwen.com/subject/cjiszxtx.html