请自动化内存分配
Docker Desktop 在启动瞬间会占用物理内存的一半。由于虚拟化框架的错误,即使关闭容器,内存也不会归还。一旦 macOS 内核开始进行磁盘交换(Disk Swap),即使是 Apple Silicon 也无法避免 I/O 瓶颈。在运行 JVM 基础应用时,容器无故崩溃出现的 Exit Code 137 现象,仅靠调整堆大小(Heap Size)是无法解决的。
请手动计算并填入每个服务的内存限制值。总阈值 可通过以下公式得出:
使用以下脚本控制环境变量,可以防止本地服务宕机:
- 使用
sysctl -n hw.memsize查看 Mac 的总 RAM 容量。 - 根据项目规模,设定一个 768MB 到 3072MB 之间的值。
- 在
.env文件中自动注入分配值,例如BACKEND_MEM_LIMIT=1536M。
文件系统权限与 VirtioFS 设置
macOS APFS 与 Linux 容器之间的权限不匹配是导致构建错误的原因。根据 DDEV 基准测试,应用 VirtioFS 替代现有的 gRPC FUSE,并在 Colima 环境中并行使用 Mutagen 同步,可使 Drupal 的安装速度从 102 秒缩短至 27 秒,提升幅度达 73%。
为了减少性能瓶颈,请应用以下设置:
- 使用外置 SSD 时,执行
sudo diskutil apfs changeOwnerSharing /Volumes/ExternalSSD-Dev enable命令以忽略权限结构。 - 在
docker-compose.yml文件的develop.watch.sync规则中,将node_modules等繁重路径排除在同步对象之外。 - 启动 Colima 时添加
--mount-inotify选项,使 FSEvents 信号符合 Linux 内核要求。
完成此配置后,代码修改时产生的延迟将恢复至 95% 的物理设备速度水平。
自动规避端口冲突脚本
混用多个虚拟化运行时会导致 Docker Socket 路径混乱。由于 Apple 容器框架独立构建微型 VM,因此网络管理较为复杂。
为防止端口冲突,请使用网络自动校准脚本:
- 使用
lsof -i -P -n命令查找当前正在使用的端口(如 8080 或 5432)。 - 若检测到冲突,则通过增量搜索方式寻找空闲端口(尝试 50 次)。
- 将获取到的端口号更新至
.env文件并启动容器。
用于防止数据丢失的本地卷绑定
容器被删除后,数据库文件也会随之消失。请将卷绑定到物理磁盘的特定路径,例如 /Volumes/ExternalSSD-Dev/DockerData/volumes/pg_data_core/。
为了具备数据恢复的韧性,需要执行以下步骤:
- 使用
docker compose exec命令对 PostgreSQL 数据进行流式转储(Streaming Dump),并使用gzip压缩存储。 - 恢复时使用
gunzip -c将压缩文件直接注入容器。 - 在脚本中加入
read选项,强制执行恢复操作前进行确认。
采用此方式,即使导入了错误的测试数据,也能在 5 秒内恢复至正常状态。
