I processi pianificati non riescono all’interno di un container quando lo scheduler, l’ambiente, l’utente, l’orario o il percorso di runtime richiesto differiscono dal contesto operativo dell’host.
Un comando che ha successo in una shell interattiva dell’host può dipendere dal PATH dell’host, dal profilo di accesso, dal fuso orario, dai file montati, dalle credenziali, dal DNS o da un demone cron in esecuzione continua. All’interno di un container, nulla di tutto questo è garantito. Inizia verificando che un processo di pianificazione sia attivo, quindi esegui il job esatto con lo stesso ambiente minimo e lo stesso utente utilizzati da cron.
Conferma che un processo di pianificazione sia effettivamente in esecuzione
Esamina i processi attivi del container e il comando di avvio. Installare i pacchetti cron nell’immagine non avvia il demone, e un container normalmente esegue solo l’entrypoint o il comando configurato.
La discussione di lunga durata su Docker cron in Stack Overflow si concentra sulla necessità di eseguire uno scheduler all’interno del container, invece di presumere che il servizio dell’host gestisca il relativo crontab. Il primo elemento discriminante è verificare se il processo cron sia attivo quando arriva l’orario pianificato.
Se non è in esecuzione alcuno scheduler, scegli un’architettura intenzionale: esegui cron o uno scheduler compatibile con i container come processo in primo piano, usa un container separato per il job oppure richiama il container dell’applicazione dal cron dell’host. Non aggiungere un secondo demone non gestito senza decidere come registrare i log e arrestarlo.
Esegui il comando esatto con un ambiente minimo
Copia il comando pianificato ed eseguilo all’interno del container come l’utente previsto per il job, con un ambiente ridotto all’essenziale. Acquisisci stdout, stderr, il codice di uscita, la directory corrente e le variabili d’ambiente.
I job cron nei container spesso falliscono perché cron non carica il profilo della shell interattiva che forniva PATH, runtime dei linguaggi, token API o variabili dell’applicazione. Una guida agli scheduler per container evidenzia la conservazione di l’ambiente richiesto dal job come requisito fondamentale.
Se il comando fallisce solo con l’ambiente minimo, aggiungi percorsi assoluti espliciti e solo le variabili strettamente necessarie. Evita di caricare un intero profilo utente che introduca alias, prompt o segreti non pertinenti.
Controlla PATH, shell, directory di lavoro e utente
Sostituisci i comandi e i percorsi relativi con quelli assoluti. Verifica che la shell selezionata esista e che la sintassi del crontab corrisponda all’implementazione cron installata nell’immagine.
Esegui il job come l’utente cron configurato e verifica i permessi di lettura, scrittura ed esecuzione per script, configurazioni, socket e directory di output. Un test manuale eseguito solo come root non dimostra che un job pianificato senza privilegi possa completarsi.
Imposta la directory di lavoro nel comando o nello script wrapper. Se il job riesce dopo aver modificato soltanto la directory o l’utente, mantieni quel contesto esplicito nella configurazione sotto controllo versione, invece di affidarti ai valori predefiniti del container.
Confronta l’ora e il fuso orario del container con la pianificazione
Stampa l’ora corrente, il fuso orario e la prossima esecuzione prevista all’interno del container. I container condividono l’orologio del kernel dell’host, ma possono usare UTC o file del fuso orario diversi per la visualizzazione e l’interpretazione di cron.
Un caso su Server Fault mostra come l’ora del container possa apparire in un altro fuso orario anche quando l’host visualizza l’ora locale, facendo eseguire un crontab corretto all’ora locale apparente sbagliata.
Scegli una strategia esplicita per il fuso orario e verificala dopo ogni ricreazione. Non compensare modificando l’espressione cron lasciando ambiguo il fuso orario sottostante, perché l’ora legale o le modifiche all’immagine potrebbero spostarla nuovamente.
Verifica mount, segreti, accesso alla rete e durata del container
Controlla che ogni directory di input, percorso di output, segreto, socket e file di configurazione esista all’interno del container al momento dell’esecuzione. Quindi testa l’accesso a DNS, database, API o NAS dalla stessa rete del container.
Il cron dell’host può vedere percorsi dell’host assenti nel container. Un caso Nextcloud Docker dimostra come un job in background possa sembrare configurato mentre il comando, l’utente o il percorso dell’applicazione effettivi del container impediscono ancora l’esecuzione in background prevista.
Verifica inoltre che il container resti in esecuzione quando arriva l’orario pianificato. I container applicativi di breve durata e le sostituzioni durante il deployment possono terminare uno scheduler interno prima che i job di lunga durata o poco frequenti vengano completati.
Scegli un unico confine di pianificazione e dimostra che funziona senza supervisione
Affida la pianificazione a un solo componente: il cron dell’host che richiama docker exec, un container scheduler dedicato oppure uno scheduler in primo piano all’interno dell’immagine dell’applicazione. Scheduler duplicati possono eseguire due volte la stessa attività di manutenzione.
La guida di ZimaSpace sul test DNS dal container tratta una causa secondaria che si verifica quando lo scheduler si avvia ma non riesce a raggiungere un altro servizio.
Il problema è risolto solo quando il job viene eseguito all’orario previsto dopo la ricreazione del container e il riavvio dell’host, produce log acquisiti, utilizza l’utente e i percorsi previsti e genera il risultato applicativo verificato. Un comando manuale eseguito con successo non costituisce il test conclusivo.
Supporto e consigli
Altro da leggere

Perché il ripristino di un volume Docker ricrea il contenuto dei file, ma elimina gli attributi estesi?
Una diagnosi del ripristino del volume che copre l’inventario degli xattr, le opzioni di tar e Rsync, gli spazi dei nomi, il supporto della...

Perché un container in esecuzione mantiene il vecchio limite di memoria dopo la modifica del file Compose?
Una diagnosi dei limiti di memoria che copre i cgroup attivi, il riavvio rispetto alla ricreazione, i campi di Compose, i limiti rigidi e...

Perché il riavvio di un proxy inverso invalida ogni sessione per una determinata app self-hosted?
Una diagnosi della perdita di sessione che copra l’ambito dei riavvii, la gestione dei cookie, la rotazione dei segreti, le sessioni basate sulla cache,...

