Stack récente déployée sur Coolify v4. Mon docker-compose.yml monte un fichier de conf qui contient un secret partagé. Le fichier est gitignored — il n’est donc pas dans le clone que Coolify fait du repo. Première tentative de deploy : Docker crée un dossier vide à la place du fichier manquant et le mount échoue.
L’idée naturelle : poser une commande shell dans le champ Pre-deployment Command de Coolify qui templaterait le fichier depuis un .example + une env var, juste après le clone et avant le docker compose up.
sed "s|__TOKEN__|$TOKEN|g" conf/file.xml.example > conf/file.xml
Symptôme
Au déploiement suivant, Coolify affiche :
Executing pre-deployment command (see debug log for output/errors).
Pre-deployment command: Multiple containers found but no container name specified.
Available: trace-xyz-..., db-xyz-...
Deployment failed: Could not find a valid container.
Is the container name correct?
Cause
Le champ « Pre-deployment Command » de Coolify n’exécute PAS une commande shell sur l’hôte avant le compose up. C’est un docker exec dans un conteneur du stack, après qu’il soit up. Conçu pour :
- lancer une migration DB juste après le démarrage du backend
- précharger un cache
- runner un health-check personnalisé
Coolify cherche dans quel conteneur exécuter — il en trouve plusieurs et abandonne sans default. D’où le « Multiple containers found ».
Solution
Pour templater un fichier de conf avant le docker compose up, deux patterns propres :
A — Entrypoint wrapper côté conteneur cible. On commit le fichier template avec un placeholder, on override entrypoint dans le compose pour faire le sed au démarrage du conteneur, puis on chaîne le CMD original :
entrypoint:
- /bin/sh
- -c
- |
sed "s|__TOKEN__|$$TOKEN|g" /tmp/conf.tmpl > /opt/app/conf.xml
exec /opt/app/bin/server conf.xml
environment:
TOKEN: ${TOKEN}
volumes:
- ./conf.xml.example:/tmp/conf.tmpl:ro
B — Coolify « Persistent Files » (si la version le propose) : déclarer le fichier comme persistant côté Coolify, l’éditer dans l’UI, il survit aux re-clones.
Lessons learned
- « Pre-deployment Command » de Coolify ≠ pre-deploy hook style CI/CD : c’est un
docker execdans un conteneur du stack, pas une commande sur l’hôte - Bon usage : runners type
npm run migrate,flask db upgrade, post-deploy health-check — quand le nouveau code est up - Pour templater un fichier hôte avant compose up : passer par un entrypoint wrapper du conteneur cible, ou par les « Persistent Files » de Coolify si dispo
- Le placeholder dans le template peut être committé (style
__SECRET_NAME__) — c’est la substitution qui doit rester runtime, pas le templating qui doit rester hors git