Docker 构建镜像:不允许在命令行上绑定挂载的原因是什么?这是一个安全问题?
用例:
gradle 使用 /home/username/.gradle 下的神器缓存
Docker文件:
WORDIR /opt/app/src
COPY . $WORKDIR
gradle build
在 Dockerfile 中运行 gradle 将在每次构建图像时下载所有工件。
docker build -t image1 .
如果支持 bind-mount 选项,可以使用主机上的 gradle 缓存,构建速度将大大加快。
docker build -v /home/username/.gradle:/root/.gradle -t image1 .
选项由用户在命令行指定,应该没有安全问题。
使用 buildkit
RUN --mount=type=cache,target=/path ...
功能可以更好地处理这个问题(文档在他们的 git repo 中可用)。
生成的 Dockerfile 如下所示:
# syntax=docker/dockerfile:1
FROM base
WORDIR /opt/app/src
COPY . $WORKDIR
RUN --mount=type=cache,target=/root/.gradle gradle build
避免安装任意文件夹的原因是它会将主机依赖项添加到图像构建中,而这些依赖项不包含在上下文中(或提交到 git repo)。结果是图像可能只能在某些机器上构建,或者图像可能因构建位置而异。