Docker传统构建器与BuildKit在Volume处理上的行为差异及疑问
Dockerfile中Volume声明后修改行为的差异:传统构建器 vs BuildKit
我发现,在Dockerfile中修改已声明Volume对应目录的数据时,**传统构建器(legacy builder)**存在两点限制:
- 无法修改该目录的所有者及所属组;
- 无法在该目录内创建符号链接。
Docker官方文档明确说明:在Dockerfile中声明Volume后,后续构建步骤对该Volume内数据的修改会被丢弃。但这一限制仅在使用传统构建器时成立,使用BuildKit构建时则不适用。
复现步骤
- 创建包含如下内容的Dockerfile:
FROM ubuntu # Create directory that will be declared as a volume # Since the command is executed with the root user, owner and group will be root RUN mkdir /my_volume # Mark /my_volume as volume VOLUME /my_volume # Create a symlink in /my_volume that links to an existing directory (/home) RUN ln -s /home /my_volume/home # Change owner and group from /my_volume RUN chown 1000:1000 /my_volume
- 分别用传统构建器和BuildKit构建镜像:
# 传统构建器构建 DOCKER_BUILDKIT=0 docker build -t image_legacy .
# BuildKit构建 DOCKER_BUILDKIT=1 docker build -t image_buildkit .
- 查看传统构建器构建的镜像结果:
docker run image_legacy ls -la /my_volume
输出:
total 8 drwxr-xr-x 2 root root 4096 May 7 16:01 . drwxr-xr-x 1 root root 4096 May 7 16:19 ..
可见所有修改被丢弃,符号链接未创建,目录所有者仍为root。
- 查看BuildKit构建的镜像结果:
docker run image_buildkit ls -la /my_volume
输出:
total 8 drwxr-xr-x 2 1000 1000 4096 May 7 16:23 . drwxr-xr-x 1 root root 4096 May 7 16:23 .. lrwxrwxrwx 1 root root 5 May 7 16:01 home -> /home
可见符号链接已创建,chown命令执行成功,目录所有者已变更为1000:1000。
疑问
原有的Volume修改限制在BuildKit中似乎已被放宽,但我未找到相关官方文档说明这一变化,请问这是有意设计的行为吗?
补充环境信息:我在WSL上的Ubuntu 22.04.1 LTS中安装了Docker(未使用Docker Desktop)。
内容的提问来源于stack exchange,提问作者Arber
相关产品推荐
相关产品推荐

