Solução da comunidade

Erro «Não é um diretório» do Docker Mosquitto no CasaOS: corrija a montagem vinculada em vez de reinstalar

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.

O utilizador de origem interpretou a falha como «o Docker não consegue instalar uma imagem após uma reinstalação limpa», mas o resultado do terminal mostrava, na realidade, dois problemas distintos. A execução docker info sem acesso elevado falhou no socket do Docker, enquanto a execução do contentor Mosquitto com privilégios do Docker transferiu com êxito eclipse-mosquitto:latest. O contentor falhou então por um motivo diferente: o bind mount tentou tratar um caminho do anfitrião e um caminho do contentor como tipos incompatíveis de ficheiro/diretório.

Esta distinção é fundamental. Reinstalar o Debian, o CasaOS ou o Docker não corrigirá um bind mount que aponte para o tipo errado de objeto do sistema de ficheiros.

Problema 1: O utilizador normal não conseguiu aceder ao socket do Docker

O primeiro docker info a saída indicava:

permissão negada ao tentar ligar ao socket do daemon do Docker
unix:///var/run/docker.sock

Isso significa que o utilizador da shell não tinha permissão para comunicar diretamente com o daemon do Docker. O mesmo comando funcionou com sudo, provando que o daemon estava acessível.

Isto é separado do erro posterior de arranque do Mosquitto.

A imagem do Mosquitto foi transferida com êxito

O Docker comunicou:

Estado: Imagem mais recente transferida para eclipse-mosquitto:latest

Assim, o registo, o nome da imagem e a ligação à Internet não eram o problema imediato. A falha ocorreu apenas quando o Docker tentou criar o sistema de ficheiros do contentor e aplicar o bind mount.

O verdadeiro erro foi a montagem entre ficheiro e diretório

O comando tentou mapear:

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

O Docker comunicou então:

não é um diretório
Está a tentar montar um diretório num ficheiro (ou vice-versa)?

Essa mensagem deve ser interpretada literalmente. Um dos lados do mapeamento não tinha o tipo esperado pelo comando.

Porque é que o -v pode criar automaticamente o tipo errado

A documentação atual do Docker explica uma armadilha comum de -v/--volume: se o caminho de origem não existir, o Docker cria-o automaticamente como um diretório.

Por isso, se /etc/mosquitto/mosquitto.conf não existia anteriormente como um ficheiro real, o Docker poderia criar um diretório com o nome mosquitto.confMontar esse diretório no ficheiro de configuração esperado pelo contentor produz então exatamente o erro observado no tópico de origem.

Utilize o comportamento atual dos bind mounts do Docker para verificar se a origem é um ficheiro ou um diretório antes de iniciar o contentor.

A comunidade passou a mapear os diretórios do Mosquitto

Um autor da resposta partilhou uma definição Compose que mapeava três diretórios persistentes:

  • diretório de configuração do anfitrião → /mosquitto/config
  • diretório de dados do anfitrião → /mosquitto/data
  • diretório de registos do anfitrião → /mosquitto/log

Isto evita a montagem frágil de um “único ficheiro que pode ainda não existir” e fornece ao Mosquitto uma estrutura persistente normal.

O ficheiro de configuração ainda tem de existir dentro do diretório de configuração

Mapear o diretório não cria automaticamente uma configuração válida do Mosquitto. O autor da resposta disse ao utilizador para colocar mosquitto.conf no diretório de configuração mapeado antes de iniciar o broker.

Numa nova implementação, crie primeiro a configuração como um ficheiro real e, em seguida, monte o respetivo diretório-pai ou utilize a opção mais explícita do Docker --mount sintaxe, que falha em vez de criar silenciosamente um diretório de origem em falta.

A instalação personalizada do CasaOS pode expressar a mesma estrutura sem um comando docker run bruto

A comunidade orientou o utilizador na importação de uma definição Compose através do fluxo de trabalho de aplicação personalizada do CasaOS. Mais tarde, o utilizador instalou um pacote Mosquitto de uma loja de aplicações comunitárias e indicou que funcionou imediatamente.

Esse resultado confirma que o próprio anfitrião Docker conseguia executar o Mosquitto; o problema anterior era de configuração, não uma falha na reinstalação do CasaOS.

Um broker em execução ainda precisa de autenticação MQTT e configuração do listener

O utilizador de origem perguntou então porque é que o Node-RED não se ligava e se o Mosquitto utilizaria automaticamente o nome de utilizador e a palavra-passe do terminal. Não utiliza. A autenticação MQTT é configurada pelo próprio Mosquitto através da respetiva configuração e dos ficheiros de palavras-passe.

Não assuma que um estado verde do contentor significa que o broker está pronto para clientes não autenticados.

O fuso horário foi um detalhe final da configuração do contentor

Depois de instalar um pacote comunitário funcional, o utilizador ainda teve de adicionar o valor de ambiente adequado para o fuso horário. Esse é um detalhe da aplicação/do runtime, não uma prova de outra falha na instalação do Docker.

Perguntas frequentes sobre erros do Docker do Mosquitto

O Docker não conseguiu descarregar o eclipse-mosquitto?

Não. O resultado da origem mostra que a imagem foi descarregada com êxito.

Porque é que o contentor não conseguiu iniciar?

A montagem bind tinha uma incompatibilidade entre ficheiro e diretório em torno de mosquitto.conf.

Porque é que um ficheiro do anfitrião em falta pode tornar-se num diretório com docker -v?

do Docker --volume o comportamento cria a origem do anfitrião em falta como um diretório, o que pode quebrar uma montagem bind de ficheiro para ficheiro.

A reinstalação do CasaOS resolveu o problema?

Não. O utilizador acabou por conseguir depois de utilizar uma configuração correta da aplicação/do contentor.