Docker Dockerfile的介绍与基本用法

介绍

      Dockerfile是一个记录了若干命令文本文件,用来构建一个全新的镜像。

docker上下文

      拿菜鸟教程上的一个例子:docker build -t runoob/ubuntu:v1 . ,可以看到这条指令最后的参数是一个点,这个点就是上下文路径。通常大多数人会在Dockerfile存放目录中执行上面这条命令,假设Dockerfile中的指令不出错的情况下成功构建镜像了,那么他们很可能会以为命令中最后的参数——“点”,指的是Dockerfile所在的目录。
      并不能说完全不对,在上面描述的场景中确实Dockerfile所在的目录就是上下文目录。但实际上上下文目录与Dockerfile并没有必然的联系,因为Dockerfile完全是可以不在上下文目录的。假设有下面的目录结构:

work
  ├── Dockerfile
  └── workspace
    ├── a.txt
    └── html
      ├──index.html

一个work目录下有Dockerfile文件和workspace目录,workspace目录下有a.txt文件和html目录,html目录下有index.html文件。
      如果直接在work目录下执行命令docker build -t runoob/ubuntu:v1 .,可以成功构建出镜像。但如果在workspace中执行上面的命令,将会报错。或许你会说因为此时上下文路径变成了workspace,在这个路径下并没有Dockerfile,所以报错了,这个解释是对的,不过似乎有点曲解。下面我先讲讲镜像构建的过程,然后你就明白了哪里有问题:

tip:下面的说法主要是面向docker18及后续的版本,经测试docker17版本要求Dockerfile必须在上下文路径下(即Dockerfile必须被上下文目录包含,倒不要求一定要在指定的上下文目录中,也可以是上下文目录中的某个目录下),但是docker18版本Dockerfile可以不在上下文路径中,只要在docker build的时候指定Dockerfile路径即可。
      首先,docker build命令最后的参数指定的是上下文目录,在执行命令的时候如果不指定Dockerfile的路径,默认会到上下文路径中找一个名为Dockerfile的文件作为镜像构建的配置文件,并将上下文目录中的内容全部打成tar包发送给docker守护进程去解压构建镜像。(这个时候你应该能够体会到上下文路径和Dockerfile并没有必然的联系,是因为没有指定Dockerfile的路径,所以会在上下文路径中找名为Dockerfile的文件,而不是先前认为的Dockerfile所在目录就是上下文目录。)
      其次,我们完全可以手动指定Dockerfile的路径,这样一来Dockerfile和上下文路径就没有关系了(这里假设不考虑Dockerfile中涉及到上下文路径的指令),假设我在work目录下执行命令:docker build -f Dockerfile -t myimages workspace,-f 参数后面指定的是Dockerfile的路径,workspace是上下文目录。结合上面的目录结构,可以看到Dockerfile并不在上下文目录中,这种情况下也可以成功构建镜像,由此可见Dockerfile并非一定要在上下文目录下。
      总结:上下文目录是我们在docker build命令中指定的最后一个参数,这个上下文目录是由我们手动指定的,你写了什么路径,命令就会把那个路径当做上下文路径。作用是在docker build的时候会将上下文目录中的全部内容打包成tar包发送给docker守护进程,作为新镜像构建的组成文件,以及Dockerfile中命令涉及源文件路径的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值