[FIX] 根因修復 - 共享 Volume 下不需對每個容器重複同步

根因:三個容器 (laravel, queue, mqtt-worker) 共享同一份
volume mount (.:/var/www/html)。對 laravel 容器做 tar 同步時,
queue/mqtt-worker 會同時看到檔案變動,導致它們 crash → restart。
接著對 queue 容器做冗餘同步時就會撞上 restarting 狀態。

修復:
1. 只對主容器 (star-cloud-laravel) 同步一次即可
2. 同步完成後等待 worker 容器從短暫重啟中恢復
3. 移除對 queue/mqtt-worker 的冗餘 tar 同步
This commit is contained in:
sky121113 2026-04-21 16:54:45 +08:00
parent 88741dc5ae
commit d3cb9b4fee

View File

@ -60,38 +60,32 @@ jobs:
return 1
}
deploy_to() {
local container=$1
echo ">>> Syncing code to $container..."
echo ">>> Syncing code to star-cloud-laravel..."
# 三個容器共享同一份 volume (.:/var/www/html)
# 只需同步至主容器一次queue/mqtt-worker 會自動看到變更。
tar --exclude='.git' --exclude='node_modules' --exclude='vendor' --exclude='storage' --exclude='bootstrap/cache' -cf - . \
| docker exec -i star-cloud-laravel tar -xf - -C /var/www/html/
# 先確認容器已就緒,避免 restarting 狀態下 docker exec 被拒絕
wait_for_container "$container" || return 1
local_tar=${PIPESTATUS[0]} local_docker=${PIPESTATUS[1]}
echo " Result: tar=$local_tar, docker=$local_docker"
if [ "$local_tar" -gt 1 ] || [ "$local_docker" -ne 0 ]; then
echo "!!! Error: Sync failed (tar=$local_tar, docker=$local_docker)"
exit 1
fi
tar --exclude='.git' --exclude='node_modules' --exclude='vendor' --exclude='storage' --exclude='bootstrap/cache' -cf - . \
| docker exec -i "$container" tar -xf - -C /var/www/html/
# 必須在同一行賦值,否則 PIPESTATUS 會被上一個 local 指令重置
local tar_status=${PIPESTATUS[0]} docker_status=${PIPESTATUS[1]}
echo " Result: tar=$tar_status, docker=$docker_status"
if [ -n "$tar_status" ] && [ "$tar_status" -le 1 ] && [ "$docker_status" -eq 0 ]; then
return 0
else
echo "!!! Error: Sync failed for $container (tar=$tar_status, docker=$docker_status)"
return 1
fi
}
# 依序執行同步,任一失敗即中斷
deploy_to star-cloud-laravel && \
deploy_to star-cloud-queue && \
deploy_to star-cloud-mqtt-worker && \
# 程式碼同步後queue/mqtt-worker 可能因檔案變動而短暫重啟,等待它們恢復
echo ">>> Waiting for worker containers to stabilize..."
wait_for_container star-cloud-queue || exit 1
wait_for_container star-cloud-mqtt-worker || exit 1
echo ">>> All containers are running."
# 設定權限
docker exec star-cloud-laravel sh -c "
chown -R 1000:1000 /var/www/html &&
mkdir -p /.npm && chown -R 1000:1000 /.npm &&
rm -rf /var/www/html/node_modules
"
- name: Step 3 - Composer & NPM & Initialization
run: |
docker exec -u 1000:1000 -w /var/www/html star-cloud-laravel sh -c "