Docker基础-11-Dockerfile语法基本介绍

        前面我们学习了docker的一些命令,这篇来详细学习Dockerfile中的语法。前面,说过了,我们制作镜像文件,只推荐通过Dockerfile的方式去docker build出来。也就是,你要发布一个镜像,你得先学习如何写一个Dockerfile,就是先要学习Dockerfile的基本语法和使用举例。

 

一个centos7 base image官方Dockerfile

https://github.com/CentOS/sig-cloud-instance-images/blob/a77b36c6c55559b0db5bf9e74e61d32ea709a179/docker/Dockerfile

FROM scratch
ADD centos-7-docker.tar.xz /

LABEL org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20181205"

CMD ["/bin/bash"]

这个Dockfile的内容看起来也很简单,但是我们还是有些看不懂。通过本篇的学习,你就能理解上面脚本的含义。

 

FROM

来学习第一个命令FROM,字面意思就是这个镜像从什么镜像基础上做的。一般有两种,第一种是一个已知的的镜像,例如我们知道有一个base image叫 centos/latest;第二种情况是,我们制作的镜像没有base image,这时候我们就需要利用到关键字scratch,这个scratch我们在前面制作hello-docker的时候用过。下面有一张图来帮助我们解释这两种情况。

总结:尽量使用官方的base image来制作image,原因很简单,是从安全问题角度考虑的,官方的要比个人的要可靠得多。

 

LABEL

这个LABEL就是用来表明这个Image的作者,版本,描述等信息。下面这张图是一个例子,也可以看看本文开头官网的centos的Dockerfile里面的label写法。

当然LABEL也可以不写,这个关键字不是必须的。建议还是写,让这个Dockerfile更高的可读性,这里留下作者邮箱信息,就是为了方便交流的目的。

 

RUN

这个RUN很常用的,我们经常需要运行一些命令,例如安装软件,这个时候我们就需要用到RUN这个指令。

总结:RUN需要注意的一点,每次运行RUN一次都会产生新的layer(层), 我们知道一个image是有很多层的,所以,最佳的实践是一个RUN 里面写多个命令,用&&连接多个命令,为了可读性和美观,使用换行符,多行显示RUN里面要执行的命令。

 

WORKDIR

这个WORKDIR指令是工作目录的意思,如果你学习过jenkins或者pipeline语法,里面也有类型的语法,在pipeline里面有dir的指令。他们功能都是一样,限定当前镜像/容器工作的目录位置。

总结:看看上面这个图,尝试理解下WORKDIR的作用和特点。注意上面/test,如果系统没有这个路径,支持自动创建test目录。说起限定工作目录,有人说了通过RUN cd 工作目录也可以达到这效果。但是,建议使用WORKDIR而不是使用RUN cd,而且在写工作目录的时候尽量写绝对路径,不要写相对目录。

 

ADD 和COPY

这里把ADD和COPY两个指令放一起,说明它们两个功能很类似。有时候,随便使用哪一个都行,它们的作用都是把本地的文件添加到Docker image里面。两者唯一的区别是,ADD的功能更强大一些,ADD会拷贝文件并且解压文件,COPY只能拷贝文件。

解读下第一个ADD hello /这个命令,这个我们前面文章做第一个DIY镜像的时候使用到了这个ADD命令,hello是本地系统的一个文件, 第二个参数/是指我们接下来要build的docker image的根目录。

总结:如果只是复制文件,那么ADD和COPY随便使用,建议COPY优先于ADD,如果还要解压,那么就用ADD指令。如果要添加远程的文件或者目录,请使用curl或者wget语句。

 

ENV

指令ENV就是设置一个环境变量

上面的图说明,如果一个Dokcerfile里面使用到了多个MYSQL_VERSION, 如果不使用环境变量,当发生改变,例如从5.6换成5.7版本,你得修改多处。但是如果有了ENV,你只需要改一次。

 

VOLUME 和 EXPOSE

这两个指令分别是存储和网络相关的,目前我们还没有学习到,后面来学习。

CMD和ENTRYPOINT

这两个指令也是后面学习,前面文章我提到过,CMD后面的命令是启动容器之后,默认要运行的程序或者执行的命令。

 

Dockfile最好的参考学习资料

在github上有一个docker-library的项目,里面有很多项目的Dockerfile的例子。https://github.com/docker-library

例如,我们找到一个MYSQL5.6的Dockefile的例子。https://github.com/docker-library/mysql/blob/master/5.6/Dockerfile

这个要比我们文章开头的要难很多,但是学习到这里,很多命令你基本上能看到,仔细一读,还是可以看到一大半以上的内容。

 

好了Dockerfile的基本语法我们就学习到这里,后面肯定有很多相关没有学习过的指令需要我们动手去写Dockerfile去实践。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值