dockur/windows 的 Samba 共享文件夹怎么设为只读?
dockur/windows 容器默认开启 Samba 文件共享:宿主机上 bind mount 到 /shared 的目录,会以桌面 Shared 文件夹和 Z: 盘的形式出现在 Windows 客户机里,用来在宿主机与容器内的 Windows 之间交换文件。如果 Windows 端只允许读取、不允许改动宿主机文件,可以在 compose 文件中加一个环境变量 SAMBA_READONLY。这篇文章说明如何开启只读模式、配置会在容器内如何生效,以及相关的边界条件。资料来自 readme.md、docs/environment.md 和 src/samba.sh。
共享文件夹是如何建立的
先确认你的共享方式符合文档描述的路径,这是只读设置生效的前提:
-
在 compose 文件中把宿主机目录 bind mount 到容器的
/shared,例如:volumes: - ./example:/shared文档说明
./example是示例路径,需替换为你实际要共享的宿主机文件夹。 -
安装完成后,Windows 桌面会出现
Shared文件夹,并映射为Z:盘(见 readme.md 中 “How do I share files with the host?”;盘符映射由安装脚本写入,见 src/answer.sh 中net.exe use Z: \\host.lan\Data /persistent:yes)。 -
容器启动时会生成 Samba 配置并启动
smbd,共享名在配置里为Data。Samba 默认就是开启的:SAMBA变量默认值为Y(见 docs/environment.md 的 File Sharing 一节)。
开启只读模式
SAMBA_READONLY 变量默认是 N,文档中的说明为 “Enables read-only mode for the shared folder”。把它设为 Y 即可:
services:
windows:
image: dockurr/windows
container_name: windows
environment:
VERSION: "11"
SAMBA_READONLY: "Y"
devices:
- /dev/kvm
- /dev/net/tun
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
volumes:
- ./windows:/storage
- ./example:/shared
restart: always
stop_grace_period: 2m
其中 ./example 替换为你实际要共享的宿主机文件夹;./windows:/storage 是保存磁盘镜像的挂载,可按文档要求调整。
从 src/samba.sh 的实现可以看到配置的具体生效方式:脚本在每次容器启动时重写 /etc/samba/smb.conf,为每个共享段生成如下条目:
[Data]
path = /shared
comment = Shared
read only = yes
guest ok = yes
guest only = yes
也就是说,SAMBA_READONLY=Y 时会写入 read only = yes,否则写入 read only = no。由于配置是每次启动时重新生成的,修改环境变量后需要重建(或重启)容器,Samba 才会以只读方式重新导出共享;在 Windows 一侧,对应的表现就是 Shared 文件夹 / Z: 盘变为只读,无法写入宿主机目录。
验证与调试
- 成功条件:重启容器后,容器内的 Samba 配置中该共享段带
read only = yes;在 Windows 中访问Z:盘或桌面Shared文件夹可以读取内容,写入会被 Samba 拒绝(这正是 docs/environment.md 中该变量的语义:“Enables read-only mode for the shared folder”)。 - 调试输出:如果共享行为不符合预期,可以加
SAMBA_DEBUG: "Y"开启 Samba debug 输出,脚本会实时跟踪/var/log/samba/log.smbd等日志;容器内 Samba 主配置路径为/etc/samba/smb.conf(src/samba.sh 中SAMBA_CONFIG的默认值)。
需要注意的边界
- 共享目录本身不可写时也是只读:即使未设置
SAMBA_READONLY,脚本也会对共享目录做一次真实的写入探测(mktemp测试文件);如果宿主机挂载本身不可写,该共享会自动以只读方式导出。另外,未挂载/shared且没有兼容路径时,容器会发布一个仅含使用说明的内置目录,该回退共享永远是只读的。 - Samba 依赖网络:
NETWORK设为N禁用网络时,Samba 服务整体不启动(src/samba.sh 中disabled "$NETWORK" && return 0),此时谈共享只读已无意义;NAT 模式下容器会预留 139/tcp、445/tcp 给 Samba(见 src/install.sh 中reserveSambaPorts)。 - 只读作用于共享导出层:
SAMBA_READONLY控制的是 Samba 共享的读写权限,宿主机上的源文件夹及其权限不变;如果你只是想改变挂载位置,参考 readme.md 中 “How do I change the storage location?”。
完成以上配置并重建容器后,Z: 盘与 Shared 文件夹即按只读方式提供文件交换能力,宿主机目录不会再被容器内的 Windows 写入。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00