fix: deduplicate sidecars/systemd, block system-critical stops, filter runtime paths

This commit is contained in:
2026-05-22 22:56:00 +04:00
parent 186ab2325f
commit 76b06b157a
4 changed files with 45 additions and 60 deletions
+31 -7
View File
@@ -20,6 +20,13 @@ from manifest.manifest import build_manifest, save_manifest, review_manifest
_ARCHIVE_DIR = "/tmp/docker-migrate-archives"
# Сервисы, которые НЕЛЬЗЯ останавливать/включать в архив — они управляют средой выполнения
SYSTEM_CRITICAL = {
"docker.service", "containerd.service", "docker.socket",
"systemd-journald.service", "systemd-networkd.service",
"systemd-timesyncd.service", "systemd-resolved.service",
"systemd-logind.service", "ssh.service", "sshd.service",
}
def run_source_mode():
state.reset_state(mode="source")
@@ -224,9 +231,16 @@ def do_pack():
details = s.get("details", {})
for f in details.get("files", []):
if os.path.isfile(f):
# Пропускаем runtime/system пути — они не относятся к сервису
if any(f.startswith(p) for p in (
"/proc/", "/sys/", "/dev/",
"/var/lib/containerd/", "/var/lib/docker/",
"/run/containerd/", "/run/docker/",
)):
continue
files_to_pack.add(f)
unit = details.get("unit")
if unit:
if unit and unit not in SYSTEM_CRITICAL:
try:
uout = run(f"systemctl show {unit} -p FragmentPath --value", check=False)
path = uout.stdout.strip()
@@ -237,6 +251,9 @@ def do_pack():
# systemd units
for u in manifest.get("systemd_units", []):
uname = u.get("name")
if uname and uname in SYSTEM_CRITICAL:
continue
p = u.get("path")
if p and os.path.isfile(p):
files_to_pack.add(p)
@@ -290,14 +307,21 @@ def do_stop_service():
success(f"Контейнер {cid[:12]} остановлен")
except Exception as e:
warn(f"Не удалось остановить контейнер: {e}")
# Дедупликация + фильтр system-critical
stopped = set()
for u in manifest.get("systemd_units", []):
uname = u.get("name")
if uname:
try:
run(f"systemctl stop {uname}", check=False)
info(f"Остановлен systemd unit: {uname}")
except Exception:
pass
if not uname or uname in stopped:
continue
stopped.add(uname)
if uname in SYSTEM_CRITICAL:
warn(f"Пропуск system-critical unit: {uname}")
continue
try:
run(f"systemctl stop {uname}", check=False)
info(f"Остановлен systemd unit: {uname}")
except Exception:
pass
else:
info("Пропуск остановки (сервис продолжает работать)")