Windows主机创建文件在Ubuntu VM构建Docker容器的权限问题
问题根因
你遇到的问题本质是VirtualBox共享文件夹的权限限制导致的:
- VirtualBox默认挂载的Windows宿主共享文件夹,会禁用Linux下的chmod、chown操作,所有文件的属主默认固定为
root:vboxsf,权限参数由挂载时的全局设置决定,无法单独修改单个文件的权限位 - Docker构建时如果上下文在共享文件夹内,COPY到镜像内的文件会继承共享文件夹的不可改权限属性,因此RUN阶段执行chmod会直接报
Operation not permitted,最终容器运行时没有执行脚本的权限
可行解决方案
方案1:移动构建目录到VM本地磁盘(最简便,优先推荐)
将共享文件夹内的整个构建目录复制到Ubuntu VM的本地文件系统路径下(比如~/docker_build/),再执行docker build操作:
cp -r /path/to/vbox_shared/build_dir ~/docker_build/ cd ~/docker_build/ docker build -t your-image .
VM本地的ext4文件系统完全支持Linux权限规则,后续所有chmod、COPY操作都会和构建服务器表现一致。
方案2:修改VirtualBox共享文件夹挂载参数
如果不想每次复制文件,可以修改共享文件夹的挂载配置支持权限修改:
- 执行
id命令查看你当前用户的uid、gid,比如输出中uid=1000(ubuntu) gid=1000(ubuntu)对应的uid是1000,gid是1000 - 编辑
/etc/fstab文件,找到共享文件夹对应的挂载行,添加参数rw,uid=1000,gid=1000,dmode=755,fmode=755(替换成你自己的uid、gid) - 重新挂载共享文件夹后生效,后续共享文件夹内的脚本默认就有执行权限,也支持chmod操作
方案3:修改Dockerfile绕过共享文件夹权限限制
如果不想改动VM环境,只需调整Dockerfile的脚本写入逻辑即可绕开权限限制:
- 若使用Docker 17.09及以上版本,直接在COPY指令中指定权限即可:
COPY --chmod=755 startService.sh /usr/local/bin/ ENTRYPOINT ["/usr/local/bin/startService.sh"] - 若Docker版本较低,可以通过读取内容生成新文件的方式处理:
COPY startService.sh /tmp/ RUN cat /tmp/startService.sh > /usr/local/bin/startService.sh && chmod 755 /usr/local/bin/startService.sh ENTRYPOINT ["/usr/local/bin/startService.sh"]
两种方式生成的可执行文件都位于镜像内部的文件系统,不受共享文件夹的权限限制,可以正常执行。
内容的提问来源于stack exchange,提问作者David M. Karr
相关产品推荐
相关产品推荐

