docker run 挂载卷_如何在构建期间将主机卷挂载到Dockerfile中的Docker容器中

本文解释了为什么在Dockerfile中使用VOLUME命令无法挂载主机卷,推荐使用多阶段构建和Buildkit的RUN --mount选项来实现。介绍了多阶段构建的概念,以及如何使用Buildkit加速构建过程并挂载缓存目录。最后,提供了使用RUN --mount语法从构建上下文绑定只读目录的示例。
摘要由CSDN通过智能技术生成

首先,回答“为什么不起作用VOLUME?” VOLUME在Dockerfile中定义a 时,只能定义目标,而不能定义卷的源。在构建期间,您将仅从中获得一个匿名卷。该匿名卷将在每个RUN命令处挂载,并预先填充映像的内容,然后在RUN命令末尾丢弃。仅保存对容器所做的更改,不保存对体积的更改。

自从提出此问题以来,已经发布了一些功能可能会有所帮助。首先是多阶段构建,它允许您构建磁盘空间效率低下的第一阶段,并将所需的输出仅复制到出厂的最后阶段。第二个功能是Buildkit,它极大地改变了图像的构建方式,并向构建中添加了新功能。

对于多阶段构建,您将有多FROM行,每行开始创建一个单独的映像。默认情况下,仅最后一张图像被标记,但是您可以复制前一阶段的文件。标准用途是具有一个编译器环境来构建一个二进制或其他应用程序工件,以及一个运行时环境作为在该工件上进行复制的第二阶段。你可以有:

FROM debian:sid as builder

COPY export /export

RUN compile command here >/result.bin

FROM debian:sid

COPY --from=builder /result.bin /result.bin

CMD ["/result.bin"]

这将导致构建仅包含生成的二进制文件,而不包含完整的/ export目录。

Buildkit将于18.09发布。这是对构建过程的完全重新设计,包括更改前端解析器的功能。这些解析器更改之一已实现了该RUN --mount选项,该选项使您可以为运行命令安装缓存目录。例如,这是一个挂载一些debian目录的文件(通过重新配置debian映像,这可以加快软件包的重新安装速度):

# syntax = docker/dockerfile:experimental

FROM debian:latest

RUN --mount=target=/var/lib/apt/lists,type=cache \

--mount=target=/var/cache/apt,type=cache \

apt-get update \

&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \

git

您可以根据自己的应用程序缓存来调整缓存目录,例如$ HOME / .m2(用于maven)或/root/.cache(用于golang)。

TL; DR:答案在这里:使用该RUN --mount语法,您还可以从构建上下文绑定安装只读目录。该文件夹必须存在于构建上下文中,并且不会映射回主机或构建客户端:

# syntax = docker/dockerfile:experimental

FROM debian:latest

RUN --mount=target=/export,type=bind,source=export \

process export directory here...

请注意,由于目录是从上下文挂载的,因此它也是只读挂载的,您不能将更改推回主机或客户端。构建时,您需要18.09或更高版本的安装,并使用启用构建工具包export DOCKER_BUILDKIT=1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值