Aller au contenu
Sylvain Joffraud l4w
Retour

Coolify « Pre-deployment Command » : un exec, pas un shell

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 :

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


Partager cet article :

Article précédent
Harnais de tests bash pour une API PDF qu’on ne maîtrise pas
Article suivant
Hash de mot de passe en Node : scrypt sans dépendance native