Oui. Cron ou un minuteur systemd sur l’hôte peut lancer une commande de conteneur ponctuelle, mais il doit reproduire l’environnement, l’identité, le réseau et les règles de verrouillage de l’application.
La question de compatibilité devient concrète lorsqu’une application auto-hébergée a besoin d’un nettoyage, d’une indexation, d’une exportation ou d’une sauvegarde périodique sans ajouter de démon cron au conteneur de l’application. Commencez par un chemin ou un compte jetable, conservez l’état fonctionnel précédent et évaluez la conception sur la base de la charge de travail d’origine plutôt que sur un test de connexion ponctuel.
Définir le contrat de planification et de cycle de vie
La branche prise en charge est une commande ponctuelle idempotente lancée avec la même configuration de projet. La branche concurrente est une tâche hôte à laquelle il manque l’environnement, le répertoire de travail, le verrouillage ou la disponibilité du service. Consignez les versions, les identités, les adresses, les chemins de montage, les autorisations et l’état observable actuel avant de modifier l’une ou l’autre branche.
Le comportement de container exec pertinent définit la première limite de compatibilité. Utilisez-le pour circonscrire l’affirmation, puis vérifiez le même comportement sur ce serveur domestique précis au lieu de considérer une fonctionnalité documentée comme la preuve que toute la conception fonctionne.
Écrivez la règle de décision avant le test : la réussite doit faire en sorte que la tâche atteigne le service prévu, refuse les chevauchements dangereux, écrive dans les volumes attendus et produise une erreur visible avec un code de sortie différent de zéro ; l’échec inclut les cas où la commande utilise un autre projet, perd des secrets, démarre avant ses dépendances ou où deux exécutions modifient le même état. Cela empêche de prendre une connexion partielle ou une sortie de commande normale pour une compatibilité de bout en bout.
Exécuter la tâche avec l’identité de production
Utilisez un seul élément discriminant contrôlé : exécutez manuellement la commande exacte en tant qu’utilisateur hôte planifié, consignez l’environnement et le code de sortie, puis déclenchez deux exécutions jetables qui se chevauchent. Gardez constants le client, la charge de travail, l’ensemble de fichiers, le compte et le calendrier afin que le composant modifié soit la seule explication plausible.
Utilisez les règles d’environnement de crontab pour choisir la seconde observation importante pour ce chemin. Capturez les deux côtés de la transaction : résolveur ou route, protocole négocié, identité du processus, code de sortie, latence, octets transférés et tout événement de récupération.
Répétez le test après l’événement de cycle de vie indiqué dans le titre : recréation, reconnexion, remontage, redémarrage, basculement ou changement de client. Une conception qui ne fonctionne que tant que d’anciens sockets, caches ou identifiants restent actifs n’a pas réussi.
cd /srv/app && flock -n /run/app-job.lock docker compose exec -T app app-cli job
Interpréter le chevauchement, l’échec et l’état de sortie
RÉUSSITE : la tâche atteint le service prévu, refuse les chevauchements dangereux, écrit dans les volumes attendus et produit une erreur visible avec un code de sortie différent de zéro. Enregistrez les versions exactes et la topologie ayant produit cet état, car la conclusion s’applique à ces conditions et non à toutes les implémentations du protocole.
ÉCHEC : la commande utilise un autre projet, perd des secrets, démarre avant ses dépendances ou deux exécutions modifient le même état. Vérifiez les dépendances partagées telles que le DNS, la MTU, l’identité, l’état du pare-feu, la latence du stockage et les sessions mises en cache avant de déclarer l’une ou l’autre branche principale responsable.
EXCEPTION : désactivez la planification, restaurez la définition de tâche précédente et ajoutez explicitement le chemin du projet, le verrou, le délai d’expiration et les vérifications d’état. N’élargissez pas les privilèges, ne supprimez pas les données sources, n’affaiblissez pas la sécurité du transport et ne remplacez pas le stockage fonctionnel tant qu’une observation reproductible n’a pas identifié la limite en échec.
Vérifier la prochaine exécution planifiée, pas seulement la première
Appliquez uniquement l’action correspondant à la branche observée, puis relancez la charge de travail d’origine. Conservez la conception uniquement lorsque la tâche atteint le service prévu, refuse les chevauchements dangereux, écrit dans les volumes attendus et produit une erreur visible avec un code de sortie différent de zéro sur deux cycles de vie pertinents et sous la charge concurrente attendue.
Utilisez les politiques de redémarrage des services pour vérifier le flux de travail dépendant le plus proche. Son comportement en matière d’accès, de calendrier et de récupération doit rester inchangé tant que la nouvelle conception est active.
Arrêtez-vous et revenez à l’état sauvegardé si la commande utilise un autre projet, perd des secrets, démarre avant ses dépendances ou si deux exécutions modifient le même état. Transmettez les horodatages, les versions exactes, les éléments de preuve concernant la route ou le montage et la reproduction la plus réduite possible au lieu d’ajouter un autre contournement.
Comparez le résultat aux vérifications d’état des conteneurs afin que le risque ne soit pas simplement déplacé vers une autre couche réseau, d’identité, de sauvegarde ou de stockage.
Pour les tâches de conteneur planifiées sur l’hôte, la réponse nuancée est donc le jugement initial, et non un oui inconditionnel. L’état observable de réussite constitue la limite d’acceptation ; l’état d’échec constitue la limite de restauration.
FAQ
Cron doit-il utiliser docker exec ou docker compose run ?
Utilisez exec pour une commande à l’intérieur du service en cours d’exécution ; utilisez une exécution ponctuelle lorsque l’image prend en charge un conteneur de tâche isolé.
Où doivent être enregistrés les journaux des tâches planifiées ?
Envoyez la sortie standard et la sortie d’erreur vers un journal hôte conservé ou un chemin de supervision, et déclenchez une alerte en cas de code de sortie différent de zéro.
Que se passe-t-il lors de la mise à jour d’une application ?
Mettez en pause le minuteur ou contrôlez son exécution afin qu’il ne puisse pas chevaucher des migrations, des gels de sauvegarde ou le remplacement d’un conteneur.
Assistance et conseils
Plus à lire

Une galerie auto-hébergée peut-elle préserver l’association des Live Photos Apple ?
Une décision conditionnelle concernant un serveur personnel pour l’association des Live Photos Apple, avec des tests contrôlés, l’interprétation des résultats, une procédure de retour...

Pouvez-vous importer Google Takeout et les sauvegardes de téléphone dans une seule photothèque ?
Une décision conditionnelle concernant un serveur domestique pour l’importation groupée de photos, avec des tests contrôlés, l’interprétation des résultats, un retour en arrière et...

Immich peut-il utiliser une bibliothèque externe sans prendre possession des fichiers ?
Une décision conditionnelle pour serveur personnel concernant la propriété des bibliothèques externes d’Immich, avec des tests contrôlés, l’interprétation des résultats, un retour en arrière...

