Não esqueça de executar docker remove app ao reinstalar o discourse

Uso o Discourse há vários anos. Configuro uma nova instância a cada 6 meses. Minha configuração inclui Docker e um proxy baseado em Nginx, então talvez seja um pouco não padrão. Por esse motivo, não estou usando o discourse-setup.

A cada 6 meses, quando repito esse processo, depois de clonar uma cópia limpa do Discourse de seu git e executar ./launcher bootstrap app, o contêiner falha ao iniciar. O log mostra:

anacron: Can't chdir to /var/spool/anacron: No such file or directory
run-parts: /etc/runit/1.d/anacron exited with return code 1
run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/01-cleanup-web-pids
run-parts: executing /etc/runit/1.d/anacron
anacron: Can't chdir to /var/spool/anacron: No such file or directory

ad infinitum.

Geralmente, faço uma série de etapas para reconfigurar, reiniciar, remover plugins, adicioná-los novamente, etc., até que finalmente funcione, sem nunca aprender o que realmente fez funcionar. 6 meses depois, a mesma coisa acontece novamente. Eu trabalho apenas para consertar, e não está claro qual das muitas etapas que tomo na época realmente fez funcionar.

Desta vez, porém, acredito que finalmente encontrei o problema, e é este: aparentemente, ./launcher start app reinicia instâncias de contêiner antigas chamadas app, mesmo quando o Discourse foi clonado e reconfigurado.

A etapa que falta é docker remove app. Em resumo:

./launcher stop app
docker remove app
... agora clonar, reconfigurar e launcher start app funciona

Meu erro foi esperar que, após executar ./launcher bootstrap app, o próximo ./launcher start app iniciasse a nova imagem do contêiner, mas isso não parece ser o caso. Naturalmente, as coisas dão errado com a antiga, já que o caminho /var/discourse/shared foi reinicializado.

Estou deixando isso aqui caso outros procurem pelas mesmas mensagens de erro de log.

Como uma possível melhoria, seria bom se o contêiner detectasse que seu diretório /var/discourse/shared mudou.

2 curtidas

Se você quiser executar o bootstrap, a “maneira do Discourse” é

./launcher bootstrap app
./launcher destroy app
./launcher start app

Mas se você tiver apenas um contêiner, não há razão para não apenas

./launcher rebuild app

como a maioria dos exemplos diz. Isso para o contêiner em execução, faz o bootstrap de um novo e o inicia. Se o bootstrap falhar por algum motivo, você pode (geralmente) reiniciar o antigo com ./launcher start app (como você descreveu).

Acho que vejo o problema, e está relacionado à usual confusão entre “instância de contêiner” e “imagem de contêiner”.

Se você olhar em 10. Manutenção Pós-Instalação, por exemplo, ele diz:

Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
Commands:
    start:      Inicia/inicializa um contêiner
    stop:       Para um contêiner em execução
    restart:    Reinicia um contêiner
    destroy:    Para e remove um contêiner
    enter:      Usa nsenter para obter um shell em um contêiner
    logs:       Visualiza os logs do Docker para um contêiner
    bootstrap:  Inicializa um contêiner para a configuração com base em um template
    rebuild:    Reconstrói um contêiner (destrói o antigo, inicializa, inicia um novo)
    cleanup:    Remove todos os contêineres que pararam por mais de 24 horas

Na maioria dos usos da palavra “contêiner” nesta saída de ajuda, ela se refere a uma instância de um contêiner. Exceto em bootstrap, onde se refere a uma imagem. (./launcher bootstrap usa docker commit para criar uma nova imagem a partir da qual instâncias de contêiner subsequentes podem ser lançadas.) Acho que isso foi inesperado (e eu ingenuamente assumi que isso também afetaria a instância app atual.)

Em rebuild, a palavra contêiner se refere tanto a imagens de contêiner quanto a instâncias, pois envolve um conjunto de operações que afetam tanto instâncias de contêiner quanto imagens de contêiner.

E não está claro a que se refere em cleanup - apenas as instâncias serão removidas, ou a imagem inicializada também?

1 curtida