Install Discourse for development using Docker

Ya he intentado esto en dos máquinas y ambas fallan con un error de permisos.

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 está en ejecución, pero tu lockfile se generó con 2.4.1. Instalando Bundler 2.4.1 y reiniciando usando esa versión.
Obteniendo metadatos de gemas de https://rubygems.org/.
Obteniendo bundler 2.4.1

Reintentando descarga de gema desde https://rubygems.org/ debido a error (2/4): Bundler::PermissionError Hubo un error al intentar escribir en `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Es probable que necesites otorgar permisos de escritura para esa ruta.

Reintentando descarga de gema desde https://rubygems.org/ debido a error (3/4): Bundler::PermissionError Hubo un error al intentar escribir en `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Es probable que necesites otorgar permisos de escritura para esa ruta.

Reintentando descarga de gema desde https://rubygems.org/ debido a error (4/4): Bundler::PermissionError Hubo un error al intentar escribir en `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Es probable que necesites otorgar permisos de escritura para esa ruta.

Hubo un error al instalar la versión bloqueada de bundler (2.4.1), vuelve a ejecutar con la bandera `--verbose` para más detalles. Continuando usando bundler 2.4.2.
Obteniendo metadatos de gemas de https://rubygems.org/.........
Obteniendo https://github.com/discourse/mail.git
Hubo un error al intentar escribir en `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git`.
Es probable que necesites otorgar permisos de escritura para esa ruta.
1 me gusta

Yo también me encontré con este problema.

1 me gusta

¿Alguna novedad sobre esto?

Hola,\n\nSoy totalmente nuevo y novato. Intento configurar Discourse en dev Ubuntu 22.04 antes de desplegarlo en GitHub y luego en el servidor (no tengo idea de cómo, pero ahora no importa)\n\nIntenté instalar Dicourse localmente usando docker (usando este tutorial).\n\nCreo que instalé docker correctamente, pero cuando escribo:\n\nsudo d/rails s\n\nObtengo "GitHub - discourse/mail: A Really Ruby Mail Library aún no se ha extraído. Ejecute bundle install primero."\n\ny cuando ejecuto \n\nsudo d/bundle install \n\nObtengo:\n"Obteniendo https://github.com/discourse/mail.git\nHubo un error al intentar escribir en\n/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git. Es probable que necesites\notorgar permisos de escritura para esa ruta."\n\nPor favor, aconseja :slight_smile:

Se creó una pull request para solucionar esto: Setting bundler version to 2.4.1 which is same as version that generated lockfile to avoid failing script by nkirit · Pull Request #665 · discourse/discourse_docker · GitHub

1 me gusta

Gracias por los informes; esto debería estar solucionado con este commit

La compilación se está ejecutando y, por lo tanto, se enviará una nueva imagen discourse_dev:release en la próxima hora. Después de eso, necesitarás ejecutar d/shutdown_dev y d/boot_dev para aplicar los cambios.

4 Me gusta

¿Cómo se establece/asigna una dirección IP estática específica a este contenedor?

Hola! Tuve el mismo error.

Logré solucionarlo yendo a app/assets/javascripts y ejecutando yarn antes de ejecutar d/boot_dev --init.

Mi hipótesis es que d/boot_dev --init asume que node_modules existe en algún lugar de su ejecución. Esto falla porque no existe si acabas de clonar el repositorio.

1 me gusta

Después de seguir este tutorial en Ubuntu 22, el d/boot_dev --init termina con la siguiente salida:

Migrating database...
rake aborted!
Discourse::Utils::CommandError: /src/lib/discourse.rb:137:in `exec': mkdir: cannot create directory ‘/src/public/plugins/’: Permission denied
/src/lib/discourse.rb:171:in `execute_command'
/src/lib/discourse.rb:137:in `exec'
/src/lib/discourse.rb:33:in `execute_command'
/src/lib/plugin/instance.rb:727:in `activate!'
/src/lib/discourse.rb:352:in `block in activate_plugins!'
/src/lib/discourse.rb:349:in `each'
/src/lib/discourse.rb:349:in `activate_plugins!'
/src/config/application.rb:216:in `block in <class:Application>'
/src/lib/plugin.rb:6:in `initialization_guard'
/src/config/application.rb:216:in `<class:Application>'
/src/config/application.rb:75:in `<module:Discourse>'
/src/config/application.rb:74:in `<main>'
<internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
<internal:/usr/local/lib/ruby/site_ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
/home/discourse/.bundle/gems/ruby/3.2.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/src/Rakefile:7:in `<main>'
(See full trace by running task with --trace)

¿Sigue este tutorial actualizado?

1 me gusta

Para ejecutar los comandos (d/command) sin sudo, tienes que agregarte al grupo docker mediante

sudo adduser $(whoami) docker

y volver a iniciar sesión.

2 Me gusta

Hola,
Estoy teniendo exactamente el mismo problema.

Lo he hecho:
Me he agregado al grupo docker y he reiniciado el sistema. He verificado con el comando groups que efectivamente soy parte del grupo docker.

Aún así, este error sigue apareciendo.

Estoy en Ubuntu 22.04 y ya tenía docker instalado a través de Docker Desktop para otros proyectos. La cuenta de usuario con la que estoy trabajando no tiene privilegios de administrador (no es parte del grupo sudo), pero tengo acceso a una cuenta que sí los tiene. Sin embargo, no puedo usar esa otra cuenta para mi trabajo diario.
¿Es eso un problema?

¿Estás en un Ubuntu 22.04 bare metal o lo estás ejecutando como una VM WSL?

Bare metal. Ubuntu 22.04 ejecutándose de forma nativa en mi portátil de trabajo.

He notado lo siguiente:
La carpeta /src del contenedor está montada en /home/gregor/repos/discourse en mi máquina host:

En mi máquina host, después de descargar el repositorio git, esta carpeta me pertenece a mí y a mi grupo:

repos $ whoami
gregor
repos $ groups
gregor docker
repos $ pwd
/home/gregor/repos
repos $ ll
[...]
drwxrwxr-x 21 gregor gregor 4096 Mar 24 10:57 discourse/
[...]

Los scripts d/* ejecutan todos los comandos dentro del contenedor docker como el usuario discourse (ver aquí). Y ese usuario discourse no tiene acceso de escritura a esa carpeta /src montada.

rake aborted!
Discourse::Utils::CommandError: /src/lib/discourse.rb:137:in `exec': mkdir: cannot create directory ‘/src/public/plugins/’: Permission denied

Puedo reproducir esto si inicio sesión en el contenedor e intento crear carpetas allí. Si lo hago como el usuario root, tiene éxito.


En mi máquina host:

Si lo hago como el usuario discourse, falla:

Sin embargo, no puedo conectar esto del todo :thinking:

Hm. Ejecuto Ubuntu 22.04 dentro de WSL en Windows:

Después de d/shell:

y

$ docker inspect -f "{{ .Mounts }}" discourse_dev
[{bind  /home/toka/dv/discourse/discourse/data/postgres /shared/postgres_data  delegated true rprivate}
 {bind  /home/toka/dv/discourse/discourse /src  delegated true rprivate}]

¿Es tu UID en el host diferente de 1000 por casualidad? Si es así, ahí es donde está el problema. El usuario Discourse dentro de Docker es UID 1000, por lo que los archivos del host deben ser escribibles por el UID 1000.

Esta publicación de SO me ha guiado en la misma dirección que tú. Puedo confirmar que tanto mi usuario gregor en la máquina host como el usuario discourse en el contenedor tienen el mismo ID 1000.

¿Cuál es la salida de d/exec ls -lan y echo $UID?

Después de ejecutar d/shell:
image
Veo que todos los archivos son propiedad de root y no de discourse como en tu captura de pantalla.

(Tuve una publicación anterior que mostraba nobody/nogroup, lo cual fue engañoso porque trasteé creando un usuario y grupo discourse en mi máquina host, lo que no tuvo éxito. Así que borré la publicación)

Indica que todos los archivos dentro de /src son propiedad del usuario root.


(El grupo de discourse proviene de un intento anterior que no fue fructífero)

Muchas gracias por tu ayuda, por cierto. Me siento un poco estúpido, debo estar perdiendo algún conocimiento sobre el sistema de permisos de Unix.

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?

3 Me gusta