Communityoplossing

Mosquitto Docker-fout ‘Geen map’ op CasaOS: herstel de bindkoppeling in plaats van opnieuw te installeren

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.

De gebruiker interpreteerde de fout als “Docker kan na een schone herinstallatie geen image installeren”, maar de terminaluitvoer liet in werkelijkheid twee afzonderlijke problemen zien. Het uitvoeren van de docker info zonder verhoogde rechten mislukte op de Docker-socket, terwijl het uitvoeren van de Mosquitto-container met Docker-rechten het image succesvol binnenhaalde eclipse-mosquitto:latest. De container viel vervolgens om een andere reden uit: de bind mount probeerde een hostpad en een containerpad te behandelen als incompatibele bestands-/maptypen.

Dit onderscheid is cruciaal. Debian, CasaOS of Docker opnieuw installeren verhelpt geen bind mount die naar het verkeerde type bestandssysteemobject verwijst.

Probleem 1: De normale gebruiker had geen toegang tot de Docker-socket

De eerste docker info de uitvoer luidde:

toegang geweigerd bij een poging verbinding te maken met de Docker-daemonsocket
unix:///var/run/docker.sock

Dat betekent dat de shellgebruiker niet de benodigde rechten had om rechtstreeks met de Docker-daemon te communiceren. Dezelfde opdracht werkte met sudo, wat bewijst dat de daemon bereikbaar was.

Dit staat los van de latere opstartfout van Mosquitto.

De Mosquitto-image is succesvol gedownload

Docker meldde:

Status: Nieuwere image gedownload voor eclipse-mosquitto:latest

Het register, de naam van de image en de internetverbinding waren dus niet direct het probleem. De fout deed zich pas voor toen Docker het bestandssysteem van de container probeerde aan te maken en de bind mount toe te passen.

De echte fout was het koppelen van een bestand aan een map

De opdracht probeerde het volgende te koppelen:

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

Docker meldde vervolgens:

geen map
Probeer je een map aan een bestand te koppelen (of andersom)?

Die melding moet letterlijk worden opgevat. Een van de zijden van de koppeling had niet het type dat de opdracht verwachtte.

Waarom -v automatisch het verkeerde type kan aanmaken

De huidige Docker-documentatie legt een veelvoorkomende valkuil van -v/--volume uit: als het bronpad niet bestaat, maakt Docker het automatisch aan als een map.

Dus als /etc/mosquitto/mosquitto.conf niet al als een echt bestand bestond, kon Docker een map met de naam mosquitto.confAls die map vervolgens wordt gekoppeld aan het configuratiebestand dat de container verwacht, ontstaat precies de fout die in de oorspronkelijke thread wordt weergegeven.

Gebruik het huidige bind-mountgedrag van Docker om te controleren of de bron een bestand of een map is voordat je de container start.

De community schakelde over op het koppelen van Mosquitto-directories

Een beantwoorder deelde een Compose-definitie waarin drie persistente directories werden gekoppeld:

  • hostconfigdirectory → /mosquitto/config
  • hostdatadirectory → /mosquitto/data
  • hostlogdirectory → /mosquitto/log

Zo vermijd je de kwetsbare koppeling van één bestand dat mogelijk nog niet bestaat en krijgt Mosquitto een normale persistente indeling.

Het configuratiebestand moet nog steeds in de configuratiemap aanwezig zijn

Het koppelen van de directory maakt niet automatisch een geldige Mosquitto-configuratie aan. De beantwoorder vertelde de gebruiker om te plaatsen mosquitto.conf in de toegewezen configuratiemap voordat je de broker start.

Maak voor een nieuwe implementatie eerst het configuratiebestand als echt bestand aan en koppel vervolgens de bovenliggende directory, of gebruik Docker's explicietere --mount syntaxis, die mislukt in plaats van stilzwijgend een ontbrekende brondirectory aan te maken.

Met een aangepaste installatie in CasaOS kan dezelfde indeling worden opgegeven zonder een rechtstreeks docker run-commando

De community begeleidde de gebruiker bij het importeren van een Compose-definitie via de workflow voor aangepaste applicaties van CasaOS. De gebruiker installeerde later een Mosquitto-pakket uit een community-appstore en meldde dat het direct werkte.

Die uitkomst bevestigt dat de Docker-host zelf Mosquitto kon uitvoeren; het eerdere probleem was een configuratiefout en geen mislukte herinstallatie van CasaOS.

Een draaiende broker heeft nog steeds MQTT-authenticatie en listenerconfiguratie nodig

De brongebruiker vroeg vervolgens waarom Node-RED geen verbinding maakte en of Mosquitto automatisch de gebruikersnaam en het wachtwoord van de terminal zou gebruiken. Dat doet het niet. MQTT-authenticatie wordt door Mosquitto zelf geconfigureerd via de configuratie- en wachtwoordbestanden.

Ga er niet van uit dat een groene containerstatus betekent dat de broker klaar is voor clients zonder authenticatie.

De tijdzone was het laatste detail van de containerconfiguratie

Na het installeren van een werkend communitypakket moest de gebruiker nog de juiste tijdzonewaarde als omgevingsvariabele toevoegen. Dat is een applicatie-/runtime-detail en geen bewijs van een nieuwe mislukte Docker-installatie.

Veelgestelde vragen over Docker-fouten met Mosquitto

Is het Docker niet gelukt om eclipse-mosquitto te downloaden?

Nee. Uit de bronuitvoer blijkt dat de image succesvol is gedownload.

Waarom kon de container niet starten?

De bindkoppeling bevatte een mismatch tussen bestand en directory rond mosquitto.conf.

Waarom kan een ontbrekend hostbestand met docker -v een directory worden?

van Docker --volume dit gedrag maakt van een ontbrekende bron op de host een directory, waardoor een bindkoppeling van bestand naar bestand kan mislukken.

Heeft het opnieuw installeren van CasaOS het probleem opgelost?

Nee. De gebruiker slaagde uiteindelijk nadat hij een correcte applicatie-/containerconfiguratie had gebruikt.