许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将在容器化专栏中详细的为大家解释每一个指令的含义以及用法。
专栏订阅传送门https://blog.csdn.net/qq_38220908/category_11989778.html

        指令不区分大小写。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。(引用至官方文档>>>


语法

RUN --mount=[type=<TYPE>][,option=<value>[,option=<value>]...]

        这里--mount挂载的类型一共有五种:

bind(default)用于挂载一个上下文目录
cache主要用于挂载一个临时目录来缓存编译器和包管理器的目录。
tmpfs主要用于挂载一个tmpfs
secret允许构建容器访问诸如私钥之类的安全文件,并且此类文件不会出现在构建好的镜像中,避免密钥外泄。
ssh允许构建容器通过SSH代理访问SSH密钥,并支持密码短语

本篇介绍第一种挂载方式  --mount=type=bind

        在官方文档中,对bind类型挂载的释义是 "这种挂载类型允许将上下文或镜像中的目录(只读)绑定到正在构建容器" 。这里有三个需要注意的点:

  • 由于RUN指令是容器构建阶段生效运行,所以挂载的目录也仅仅在构建阶段可以访问。
  • 由于不同的RUN指令会创建新的层,所以只有同一个RUN指令中,才可以访问挂载的目录。  
  • 仅支持挂载上下文或者引用的镜像中存在的目录,不能挂载宿主机上的目录,或者上下文以及镜像中不存在的目录(就算挂载上也没有任何意义)。

举个栗子:

  • 先创建一个基础镜像basebind,并在/base下新建一个baseinfo.txt文档

 basebind:dockerfile

FROM alpine
WORKDIR /base
RUN echo 'this is base image,got it!' >> baseinfo.txt
  • 我们在创建另一个镜像baseref的时候,将basebind镜像中的/base目录挂载到当前镜像的/ref目录

 baseref:dockerfile

FROM alpine
WORKDIR /ref
# 将镜像bindbase中的/base目录挂载到/ref,并将挂载过来的文件复制到根目录中,重命名为refinfo.txt
RUN --mount=type=bind,target=/ref,from=bindbase,source=/base \
	cp baseinfo.txt /refinfo.txt
  • 我们运行bindref镜像后,可以看到在我们成功的将挂载过来的文件复制到了容器根目录中
docker run -it bindref
/ref # ls
/ref # cd /
/ # ls
bin          home         mnt          ref          run          sys          var
dev          lib          opt          refinfo.txt  sbin         tmp
etc          media        proc         root         srv          usr
/ # cat refinfo.txt
this is base image,got it!
/ #

         在容器运行阶段,我们将无法访问目录的挂载!

304c6ef42e9a40dc8606fe5003896477.png

         我们同样无法在一个RUN指令中获取到另一个RUN指令挂载的目录,比如我们将baseref镜像的dockerfile改成如下情况:

  baseref:dockerfile 

FROM alpine
WORKDIR /ref
RUN --mount=type=bind,target=/ref,from=bindbase,source=/base
RUN cp baseinfo.txt /refinfo.txt

 则会报错:No such file or directory

0908c69d6f63487ba29bd7f8774d8247.png

        同样我们也无法直接通过bind类型挂载宿主机的目录 ,比如我们将baseref镜像的dockerfile改成如下情况:

  baseref:dockerfile 

FROM alpine
WORKDIR /ref
RUN --mount=type=bind,target=/ref,source=/base 

  则会报错:not found

5243e35a41d448a4b03b8fcc01ae3a05.png

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐