No olvides ejecutar docker remove app al reinstalar discourse

He estado usando Discourse durante varios años. Configuro una nueva instancia cada 6 meses. Mi configuración incluye docker y un proxy basado en nginx, por lo que quizás sea un poco poco estándar. Por esta razón, no estoy usando discourse-setup.

Cada 6 meses, cuando repito este proceso, después de volver a clonar una copia nueva de discourse desde su git y ejecutar ./launcher bootstrap app, el contenedor falla al iniciarse. El registro muestra:

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.

Luego, normalmente realizo una serie de pasos para reiniciar, eliminar complementos, volver a agregarlos, etc., hasta que finalmente funciona, sin llegar a saber qué fue lo que finalmente lo hizo funcionar. 6 meses después, sucede lo mismo. Trabajo solo para arreglarlo, y no está claro cuál de los muchos pasos que doy en ese momento finalmente lo hizo funcionar.

Esta vez, sin embargo, creo que finalmente encontré el problema, y es este: aparentemente, ./launcher start app reinicia instancias de contenedores antiguas llamadas app, incluso cuando Discourse ha sido reclonado y reinicializado.

El paso que falta es docker remove app. En resumen:

./launcher stop app
docker remove app
... ahora volver a clonar, reiniciar e iniciar el lanzador de aplicaciones funciona

Mi error fue esperar que después de ejecutar ./launcher bootstrap app, el siguiente ./launcher start app iniciaría la nueva imagen del contenedor, pero este no parece ser el caso. Naturalmente, las cosas se descontrolan con la antigua, ya que la ruta /var/discourse/shared ha sido reinicializada.

Dejo esto aquí en caso de que otros busquen los mismos mensajes de error de registro.

Como posible mejora, sería bueno que el contenedor detectara que su directorio /var/discourse/shared ha cambiado.

2 Me gusta

Si quieres ejecutar bootstrap, la “forma discourse” es

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

Pero si solo tienes un contenedor, no hay razón para no simplemente

./launcher rebuild app

como dicen casi todos los ejemplos. Eso detiene el contenedor en ejecución, crea uno nuevo y lo inicia. Si el bootstrap falla por alguna razón, puedes (generalmente) reiniciar el anterior con ./launcher start app (como has descrito).

Creo que veo el problema, y está relacionado con la confusión habitual entre “instancia de contenedor” e “imagen de contenedor”.

Si miras 10. Mantenimiento posterior a la instalación, por ejemplo, dice:

Uso: launcher COMANDO CONFIG [--skip-prereqs] [--docker-args STRING]
Comandos:
    start:      Iniciar/inicializar un contenedor
    stop:       Detener un contenedor en ejecución
    restart:    Reiniciar un contenedor
    destroy:    Detener y eliminar un contenedor
    enter:      Usar nsenter para obtener un shell en un contenedor
    logs:       Ver los registros de Docker de un contenedor
    bootstrap:  Inicializar un contenedor para la configuración basándose en una plantilla
    rebuild:    Reconstruir un contenedor (eliminar el antiguo, inicializar, iniciar uno nuevo)
    cleanup:    Eliminar todos los contenedores que se han detenido durante > 24 horas

En la mayoría de los usos de la palabra “contenedor” en esta ayuda, se refiere a una instancia de un contenedor. Excepto en bootstrap, donde se refiere a una imagen. (./launcher bootstrap usa docker commit para crear una nueva imagen a partir de la cual se pueden lanzar instancias de contenedor posteriores). Creo que esto fue inesperado (y yo asumí ingenuamente que también afectaría a la instancia app actual).

En rebuild, la palabra contenedor se refiere tanto a imágenes de contenedor como a instancias, ya que implica un conjunto de operaciones que afectan tanto a las instancias de contenedor como a las imágenes de contenedor.

Y no está claro a qué se refiere en cleanup: ¿solo se eliminarán las instancias o también la imagen inicializada?

1 me gusta