本文记录如何将 Dify 的 docker-compose 配置改为“非自启动模式”,避免 Docker Desktop 每次启动都自动拉起十几个容器。
Dify 官方的 compose 文件默认包含:
restart: always
这会导致所有容器(API / Web / Worker / Sandbox / Redis / Postgres / Weaviate 等)在 Docker Desktop 启动后自动恢复运行。如果你想完全手动控制 Dify 的启动,需要修改这些配置。
1️⃣ 批量修改所有 docker-compose 文件的 restart 策略
进入 Dify 部署目录:
cd D:\dify-main\docker
一次性将所有 restart: always 替换为 restart: "no":
Get-ChildItem -Filter "docker-compose*.yaml" |
ForEach-Object {
(Get-Content $_.FullName) -replace "restart:\s*always", 'restart: "no"' |
Set-Content $_.FullName
}
如果存在 unless-stopped 也一起替换:
Get-ChildItem -Filter "docker-compose*.yaml" |
ForEach-Object {
(Get-Content $_.FullName) -replace "restart:\s*unless-stopped", 'restart: "no"' |
Set-Content $_.FullName
}
检查替换情况:
Select-String -Path "docker-compose*.yaml" -Pattern "restart"
全部显示 "no" 即成功。
2️⃣ 确保存在 middleware.env 文件
Dify 的 docker-compose.middleware.yaml 依赖:
env_file:
- ./middleware.env
如果你没有该文件,可从模板创建:
Copy-Item .\middleware.env.example .\middleware.env
(内容不写也可以,compose 会使用默认变量值)
3️⃣ 必须重新创建容器让策略生效
修改 compose 文件不会影响已有容器,需要先删除再重建。
停止并删除 Dify 全部容器:
docker compose -f docker-compose.yaml -f docker-compose.middleware.yaml down
使用新的 restart 策略重新启动:
docker compose -f docker-compose.yaml -f docker-compose.middleware.yaml up -d
4️⃣ 验证 restart 策略是否真正生效
查看 API 容器的重启策略:
docker inspect docker-api-1 | Select-String -Pattern "RestartPolicy" -Context 0,3
正确结果应为:
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
或者更专业的检查方式:
docker inspect docker-api-1 |
ConvertFrom-Json |
Select-Object -ExpandProperty HostConfig |
Select-Object RestartPolicy
5️⃣ 使用 docker compose config 再次确认配置(可选)
查看最终渲染后的 compose 配置是否已全部应用:
docker compose config | Select-String -Pattern "restart"
若全部为 "no",说明修改完全成功。
🎉 至此:Dify 不会再自动随 Docker Desktop 启动
修改完成后:
-
Docker Desktop 启动 → Dify 不会自动拉起
-
你可以手动运行:
docker compose up -d -
想停止 Dify:
docker compose down
这是最干净、最可控的部署方式。
docker compose -f docker-compose.yaml -f docker-compose.middleware.yaml up -d
docker compose -f docker-compose.yaml -f docker-compose.middleware.yaml stop