用于运行Samba或AFP(netatalk)的Docker镜像,提供与macOS兼容的Time Machine备份服务。
以下标签支持amd64、armv7l和arm64架构,将根据系统架构自动拉取正确的镜像:
latest、smb
注意:afp标签在新功能更新方面已被弃用,且仅支持amd64架构。
smb标签还包含每日生成的唯一清单,格式为smb-YYYYMMDD(例如smb-20210730),可在Docker Hub查看。这些标签每日生成,本质上是smb标签清单的时间点快照,可固定使用。请注意,这些标签在Docker Hub上仅保留6个月,且不会接收安全修复。若无需固定特定镜像摘要,建议直接使用smb标签。
这些标签将显式拉取指定架构的镜像,与多架构标签的镜像完全一致。
amd64latest-smb-amd64、smb-amd64 - 基于alpine:latest的SMB镜像afp、afp-amd64 - 基于debian:jessie的AFP镜像
armv7llatest-smb-armv7l、smb-armv7l - 基于alpine:latest的armv7l架构SMB镜像arm64latest-smb-arm64、smb-arm64 - 基于alpine:latest的arm64架构SMB镜像警告:强烈建议迁移到SMB镜像,因为AFP已被Apple弃用,且SMB稳定性更高。2020年10月15日起,latest标签默认指向SMB变体。
拉取镜像命令:
docker pull mbentley/timemachine:smb
注意:若修改TM_USERNAME值,持久化卷的路径会随之改变。详见持久化数据路径。
--net=host启用Avahi发现(推荐)通过--net=host允许Avahi广播发现,常用环境变量设为默认值:
bashdocker run -d --restart=always \ --name timemachine \ --net=host \ -e TM_USERNAME="timemachine" \ -e TM_GROUPNAME="timemachine" \ -e PASSWORD="timemachine" \ -e TM_UID="1000" \ -e TM_GID="1000" \ -e SET_PERMISSIONS="false" \ -e VOLUME_SIZE_LIMIT="0" \ -v /主机备份路径:/opt/timemachine \ --tmpfs /run/samba \ mbentley/timemachine:smb
暴露端口但不使用Avahi,需手动在Finder中映射共享:
bashdocker run -d --restart=always \ --name timemachine \ --hostname timemachine \ -p 137:137/udp \ -p 138:138/udp \ -p 139:139 \ -p 445:445 \ -e TM_USERNAME="timemachine" \ -e TM_GROUPNAME="timemachine" \ -e PASSWORD="timemachine" \ -e TM_UID="1000" \ -e TM_GID="1000" \ -e SET_PERMISSIONS="false" \ -e VOLUME_SIZE_LIMIT="0" \ -v /主机备份路径:/opt/timemachine \ --tmpfs /run/samba \ mbentley/timemachine:smb
镜像兼容Kubernetes。参考timemachine-k3s.yaml示例,可在单节点k3s集群(如树莓派4)上部署TimeMachine服务器。
--net=host模式下发现功能最佳,可广播服务。若不使用该模式,需暴露上述端口并手动在Finder中映射共享(打开Finder→点击"共享"→通过smb://主机名或IP/TimeMachine连接)。--net=host仅在主机未运行Samba或Avahi时可用!也可通过SMB_PORT修改Samba端口。
若容器无法启动且日志显示Failed to start message bus: Failed to bind socket,可能是nofile资源限制过低。需在docker run或compose文件中调整nofile限制:
bash--ulimit nofile=65536:65536
armv7l镜像启动失败运行armv7l镜像时若出现以下错误:
s6-svscan: warning: unable to iopause: Operation not permitted
原因是libseccomp2包版本问题,解决方法:
为容器禁用seccomp(有安全风险):
bash--security-opt seccomp=unconfined
安装backport版本的libseccomp2:
bashwget [***] sudo dpkg -i libseccomp2_2.5.1-1~bpo10+1_armhf.deb
若主机已运行Samba/Avahi(如树莓派OS默认mDNS响应器),--net=host会导致冲突。解决方法:
在主机编辑/etc/avahi/avahi-daemon.conf:
enable-reflector=yescache-entries-max=0(避免设备名称重复)然后在容器中设置ADVERTISED_HOSTNAME为主机mDNS主机名(不含.local后缀)。
创建macvlan网络(假设子网192.168.1.0/24,网关192.168.1.1,主机网卡eth0):
bashdocker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 macvlan1
在docker run中添加:
bash--network macvlan1 --ip 192.168.1.x
yamlservices: timemachine: hostname: timemachine mac_address: "AA:BB:CC:DD:EE:FF" networks: timemachine: ipv4_address: 192.168.1.x networks: timemachine: driver: macvlan driver_opts: parent: eth0 ipam: config: - subnet: 192.168.1.0/24 gateway: 192.168.1.1
持久化存储需支持扩展文件属性(xattr),NFS等远程文件系统可能不支持。镜像会检查/opt/${TM_USERNAME}中的测试文件xattr支持并警告。默认timemachine用户UID/GID为1000:1000。
修改TM_USERNAME后,容器内数据路径会变为/opt/<TM_USERNAME>,需确保卷映射正确,否则数据会存储在容器内。
timemachinetimemachine| 变量 | 默认值 | 描述 |
|---|---|---|
ADVERTISED_HOSTNAME | 未设置 | Avahi广播的主机名(不含.local),用于Avahi反射器场景 |
CUSTOM_SMB_AUTH | no | 设置为yes时,Samba使用NTLM加密密码认证 |
CUSTOM_SMB_CONF | false | 设为true时,需挂载自定义/etc/samba/smb.conf |
CUSTOM_SMB_PROTO | SMB2 | Samba协议版本,参考Samba协议列表 |
CUSTOM_USER | false | 设为true时,需挂载/etc/passwd、/etc/group、/etc/shadow并创建数据目录 |
DEBUG_LEVEL | 1 | nmbd和smbd调试级别 |
EXTERNAL_CONF | 未设置 | 多用户配置目录(含.conf文件),详见多用户和共享 |
HIDE_SHARES | no | 设为yes时,仅显示用户可访问的共享 |
MIMIC_MODEL | TimeCapsule8,119 | 模拟的Time Capsule型号 |
TM_USERNAME | timemachine | 运行用户名称 |
TM_GROUPNAME | timemachine | 运行用户组名称 |
TM_UID | 1000 | 用户UID |
TM_GID | 1000 | 用户组GID |
PASSWORD | timemachine | 用户密码 |
SET_PERMISSIONS | false | 设为true时,入口脚本会设置/opt/<username>权限 |
SHARE_NAME | TimeMachine | 共享名称 |
SMB_INHERIT_PERMISSIONS | no | 设为yes时,新文件权限继承父目录 |
SMB_NFS_ACES | no | fruit:nfs_aces值,控制NFS ACEs支持 |
SMB_METADATA | stream | fruit:metadata值,控制OS X元数据流存储位置 |
SMB_PORT | 445 | Samba服务端口 |
SMB_VFS_OBJECTS | fruit streams_xattr | vfs objects值 |
VOLUME_SIZE_LIMIT | 0 | 备份最大容量(0为无限制),支持单位(如1 T),参考Samba文档 |
WORKGROUP | WORKGROUP | Samba工作组名称 |
IGNORE_DOS_ATTRIBUTES | false | 设为true时,Samba忽略DOS属性 |
通过EXTERNAL_CONF指定包含用户配置文件(.conf后缀)的目录,每个文件定义一个用户及共享。
EXTERNAL_CONF文件创建foo.conf定义用户foo:
iniTM_USERNAME=foo TM_GROUPNAME=foogroup PASSWORD=foopass SHARE_NAME=foo VOLUME_SIZE_LIMIT="1 T" TM_UID=1000 TM_GID=1000
EXTERNAL_CONF运行示例bashdocker run -d --restart=always \ --name timemachine \ --net=host \ --ulimit nofile=65536:65536 \ -e EXTERNAL_CONF="/users" \ -v /主机备份路径:/opt \ -v /用户配置目录:/users \ --tmpfs /run/samba \ mbentley/timemachine:smb
通过Docker secrets传递密码,示例compose配置:
yamlversion: "3.3" services: timemachine: environment: - PASSWORD_FILE=/run/secrets/password secrets: - password secrets: password: file: ./password.txt
bashdocker compose -f timemachine-compose.yml up -d
--net=host启用Avahi发现bashdocker run -d --restart=always \ --net=host \ --name timemachine \ -e CUSTOM_AFP_CONF="false" \ -e CUSTOM_USER="false" \ -e LOG_LEVEL="info" \ -e MIMIC_MODEL="TimeCapsule6,106" \ -e TM_USERNAME="timemachine" \ -e TM_GROUPNAME="timemachine" \ -e TM_UID="1000" \ -e TM_GID="1000" \ -e PASSWORD="timemachine" \ -e SET_PERMISSIONS="false" \ -e SHARE_NAME="TimeMachine" \ -e VOLUME_SIZE_LIMIT="0" \ -v /主机备份路径:/opt/timemachine \ -v timemachine-netatalk:/var/netatalk \ -v timemachine-logs:/var/log/supervisor \ mbentley/timemachine:afp
bashdocker run -d --restart=always \ --name timemachine \ --hostname timemachine \ -p 548:548 \ -p 636:636 \ -e CUSTOM_AFP_CONF="false" \ -e CUSTOM_USER="false" \ -e LOG_LEVEL="info" \ -e MIMIC_MODEL="TimeCapsule6,106" \ -e TM_USERNAME="timemachine" \ -e TM_GROUPNAME="timemachine" \ -e TM_UID="1000" \ -e TM_GID="1000" \ -e PASSWORD="timemachine" \ -e SET_PERMISSIONS="false" \ -e SHARE_NAME="TimeMachine" \ -e VOLUME_SIZE_LIMIT="0" \ -v /主机备份路径:/opt/timemachine \ -v timemachine-netatalk:/var/netatalk \ -v timemachine-logs:/var/log/supervisor \ mbentley/timemachine:afp
| 变量 | 默认值 | 描述 |
|---|---|---|
CUSTOM_AFP_CONF | false | 设为true时,需挂载自定义/etc/netatalk/afp.conf |
CUSTOM_USER | false | 设为true时,需挂载/etc/passwd、/etc/group、/etc/shadow |
LOG_LEVEL | info | netatalk日志级别 |
MIMIC_MODEL | TimeCapsule6,106 | 模拟的Time Capsule型号 |
TM_USERNAME | timemachine | 运行用户名称 |
TM_GROUPNAME | timemachine | 运行用户组名称 |
TM_UID | 1000 | 用户UID |
| `TM_GID |
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429