Después de mucha investigación y experimentación, he aprendido que Docker Desktop en Linux está causando los problemas de permisos.
Verás, la aplicación Discourse en el contenedor Docker se ejecuta como un usuario no root, concretamente el usuario discourse. Pero como está escrito, por ejemplo, aquí y aquí:
Docker Desktop en Linux ejecuta una máquina virtual y los contenedores se ejecutarán dentro de esa máquina virtual. En ese caso, no puedes simplemente montar la carpeta del host de la misma manera en los contenedores, porque primero necesitas montarla en la máquina virtual.
Por lo tanto, como alguien que no es un experto en Docker, veo dos formas de abordar este problema:
(1) Abandonar Docker Desktop en Linux y ejecutar Docker de forma nativa en su lugar
Esta parece ser la solución más sostenible, ya que veo que el contenedor de Discourse parece estar diseñado para usarse de esa manera. Solo dudo porque entonces tengo que recordar todos los comandos para administrar mis imágenes, contenedores y recursos. Y, siendo un desarrollador frontend, preferiría una interfaz gráfica para administrar las cosas. Pero supongo que tengo que abordarlo como una inversión para aprender más sobre Docker.
O
(2) Cambiar la propiedad de las carpetas montadas en el contenedor
Logré que este enfoque funcionara y ejecuté Discourse con éxito localmente desde Docker Desktop, sin embargo, veo una gran cantidad de advertencias en la Terminal y, por lo tanto, no estoy seguro de cuán sostenible es esta solución a largo plazo.
Esto implica varios pasos:
Paso 1: Clonar el repositorio
$ git clone https://github.com/discourse/discourse.git
$ cd discourse
Paso 2: Inicializar el contenedor
Desde dentro de la carpeta discourse clonada en la máquina host, ejecuta:
$ d/boot_dev
¿Qué hace? Ver aquí.
Importante: Omite la bandera --init para que no se haga nada después de la creación del contenedor.
Paso 3: Cambiar la propiedad de las carpetas
El usuario de Discourse dentro del contenedor de Docker tiene el ID 1000. Esta guía asume que el usuario de tu máquina host también tiene el mismo ID. Podría no romper las cosas si el usuario de tu máquina host tiene un ID diferente, pero no puedo probarlo y, por lo tanto, no puedo hablar sobre esta situación. Puedes averiguar tu ID ejecutando id o echo $UID en una terminal de Linux.
Desde tu máquina host, ejecuta:
# abre una shell en el contenedor de docker
$ d/shell
# ya deberías estar en /src, pero por si acaso:
$ cd /src
# cambia la propiedad de /src al usuario y grupo de discourse
$ chown 1000:1000 .
# cambia la propiedad de todos los archivos y carpetas dentro de /src al usuario y grupo de discourse (no recursivamente)
$ chown 1000:1000 *
# cambia recursivamente la propiedad de casi todas las subcarpetas al usuario y grupo de discourse
# básicamente todas las carpetas excepto 'database', porque esa pertenece al usuario y grupo 'postgres'
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor
# verifica que ha funcionado, ahora debería mostrar el usuario y grupo de discourse
$ ls -l
# sal del contenedor
$ exit
Paso 4: Continúa como de costumbre
Continúa configurando el contenedor e iniciando Discourse ejecutando lo siguiente desde tu máquina host:
# instala gems
$ d/bundle install
# migra la base de datos
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate
# crea usuario administrador
$ d/rake admin:create
# En una terminal:
d/rails s
# Y en una terminal separada
d/ember-cli
Nota:
Enfrenté algunas advertencias como esta:
fatal: detected dubious ownership in repository at '/src'
Que proviene de la cosa de virtualización de Docker Desktop en Linux.
Ignora estas advertencias, desde tu máquina host, ejecuta:
d/exec git config --global --add safe.directory /src
¿Por qué Docker Desktop para Linux ejecuta una VM?