Soluzione della community

Errore «Non è una directory» di Mosquitto Docker su CasaOS: correggi il bind mount invece di reinstallare

A January 2025 ZimaBoard/CasaOS thread where Docker initially required sudo, but the Mosquitto image itself downloaded successfully. The real container-start failure was a bind mount that tried to map a host path as a file when Docker had created or found it as a directory.

L'utente della fonte ha interpretato il problema come “Docker non riesce a installare un'immagine dopo una reinstallazione pulita”, ma l'output del terminale mostrava in realtà due problemi distinti. L'esecuzione di docker info senza privilegi elevati ha fallito sul socket Docker, mentre l'esecuzione del container Mosquitto con i privilegi Docker ha scaricato correttamente eclipse-mosquitto:latest. Il container ha quindi avuto un errore per un motivo diverso: il bind mount ha tentato di trattare un percorso dell'host e uno del container come tipi incompatibili di file o directory.

Questa distinzione è fondamentale. Reinstallare Debian, CasaOS o Docker non risolverà un bind mount che punta al tipo errato di oggetto del filesystem.

Problema 1: l'utente normale non poteva accedere al socket Docker

Il primo docker info l'output indicava:

permesso negato durante il tentativo di connessione al socket del daemon Docker
unix:///var/run/docker.sock

Ciò significa che l'utente della shell non disponeva dell'autorizzazione per comunicare direttamente con il daemon Docker. Lo stesso comando ha funzionato con sudo, dimostrando che il daemon era raggiungibile.

Questo è distinto dal successivo errore di avvio di Mosquitto.

L'immagine Mosquitto è stata scaricata correttamente

Docker ha riportato:

Stato: immagine più recente scaricata per eclipse-mosquitto:latest

Quindi il registro, il nome dell'immagine e la connessione a Internet non erano il problema immediato. Il problema si è verificato solo quando Docker ha tentato di creare il filesystem del container e applicare il bind mount.

Il vero errore riguardava il montaggio di un file al posto di una directory, o viceversa

Il comando ha cercato di mappare:

/etc/mosquitto/mosquitto.conf
→ /mosquitto/config/mosquitto.conf

Docker ha quindi riportato:

non una directory
Stai cercando di montare una directory su un file (o viceversa)?

Quel messaggio va preso alla lettera. Uno dei lati della mappatura non era del tipo previsto dal comando.

Perché -v può creare automaticamente il tipo sbagliato

La documentazione attuale di Docker spiega una trappola comune di -v/--volume: se il percorso sorgente non esiste, Docker lo crea automaticamente come directory.

Quindi, se /etc/mosquitto/mosquitto.conf non esisteva già come file reale, Docker poteva creare una directory denominata mosquitto.confIl montaggio di quella directory sul file di configurazione previsto dal container produce quindi esattamente l'errore mostrato nella discussione originale.

Usa il comportamento attuale dei bind mount di Docker per verificare se la sorgente è un file o una directory prima di avviare il container.

La community è passata alla mappatura delle directory di Mosquitto

Un referente ha condiviso una definizione Compose che mappava tre directory persistenti:

  • directory di configurazione sull’host → /mosquitto/config
  • directory dei dati sull’host → /mosquitto/data
  • directory dei log sull’host → /mosquitto/log

In questo modo si evita il fragile mount di un “singolo file che potrebbe non esistere ancora” e si offre a Mosquitto una normale struttura persistente.

Il file di configurazione deve comunque esistere nella directory di configurazione

La mappatura della directory non crea automaticamente una configurazione Mosquitto valida. Il referente ha detto all’utente di inserire mosquitto.conf nella directory di configurazione mappata prima di avviare il broker.

Per una nuova distribuzione, crea prima la configurazione come file reale, quindi monta la directory padre oppure usa l’opzione --mount più esplicita di Docker --mount sintassi, che restituisce un errore invece di creare silenziosamente una directory per la sorgente mancante.

L’installazione personalizzata di CasaOS può esprimere la stessa struttura senza un comando docker run grezzo

La community ha guidato l’utente nell’importazione di una definizione Compose tramite il flusso di lavoro delle applicazioni personalizzate di CasaOS. In seguito, l’utente ha installato un pacchetto Mosquitto da un app store della community e ha riferito che funzionava immediatamente.

Questo risultato conferma che l’host Docker era in grado di eseguire Mosquitto; il problema precedente riguardava la configurazione, non una reinstallazione di CasaOS non riuscita.

Un broker in esecuzione necessita comunque della configurazione dell’autenticazione MQTT e dei listener

L’utente ha quindi chiesto perché Node-RED non si connettesse e se Mosquitto avrebbe usato automaticamente il nome utente e la password del terminale. Non è così. L’autenticazione MQTT viene configurata da Mosquitto stesso tramite la configurazione e i file delle password.

Non dare per scontato che lo stato attivo del container significhi che il broker sia pronto per client senza autenticazione.

Il fuso orario era l’ultimo dettaglio della configurazione del container

Dopo aver installato un pacchetto della community funzionante, l’utente doveva comunque aggiungere il valore appropriato della variabile d’ambiente del fuso orario. Si tratta di un dettaglio dell’applicazione/runtime, non di una prova di un ulteriore problema di installazione di Docker.

FAQ sugli errori di Mosquitto Docker

Docker non è riuscito a scaricare eclipse-mosquitto?

No. L’output del comando indica che l’immagine è stata scaricata correttamente.

Perché il container non è riuscito ad avviarsi?

Il bind mount presentava una mancata corrispondenza tra file e directory in corrispondenza di mosquitto.conf.

Perché un file host mancante può diventare una directory con docker -v?

di Docker --volume Questo comportamento crea come directory una sorgente host mancante, interrompendo un bind mount file-a-file.

La reinstallazione di CasaOS ha risolto il problema?

No. Alla fine, l’utente è riuscito dopo aver usato una configurazione corretta dell’applicazione/del container.