Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

时间:2023-02-26 07:59:23


 语法

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

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

        这里--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

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

  • 我们在创建另一个镜像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

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

  • 我们运行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!
/ #

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

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

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind


         我们同样无法在一个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

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

 则会报错:No such file or directory

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind


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

  baseref:dockerfile 

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

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind

  则会报错:not found

Dockerfile命令详解之 RUN(二):RUN --mount=type=bind