
mbentley/timemachine用于运行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
docker-compose macvlan示例
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 |






manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务