mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-08 11:46:35 +00:00
weblate, beat and worker mount the same weblate_data and weblate_cache. Docker fills a fresh named volume from the image once per POST /containers/create, and that copy does an Lstat plus os.Mkdir per directory without tolerating EEXIST. Compose created all three at once, two populations of the image's /app/data raced, and the deploy died with "failed to mkdir /var/lib/docker/volumes/weblate_data/_data/python: file exists" in CI run 38818071194. The daemon log names the route as containers/create, so this is the population path, not a mount of a pre-existing file. Make weblate and worker depend on beat. The lever is not startup order but the Create phase, which compose runs in dependency order: beat populates both volumes alone, and by the time the other two are created no copy runs. The failing run proves that phase is ordered - COMPOSE_PARALLEL_LIMIT was 4, yet only the two existing depends_on targets reached Created before the other three began. This is compose-only. In swarm, container_depends_on drops to a bare list (plugins/lookup/container_depends_on.py:103) and docker stack deploy ignores it, so swarm behaviour is unchanged and the same race stays reachable there. A mode-independent fix needs nocopy on the non-owning mounts, which plugins/lookup/container_volumes.py cannot express today. The test reads meta/volumes.yml, collects every service sharing a volume and requires each non-beat sharer to name beat. Against the previous template it yields weblate False, beat True, worker False, so it fails without this change. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>