Install Discourse for development using Docker

Ho provato su due macchine e entrambe stanno fallendo con un errore di permessi.

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 è in esecuzione, ma il tuo lockfile è stato generato con 2.4.1. Installazione di Bundler 2.4.1 e riavvio utilizzando tale versione.
Recupero dei metadati delle gem da https://rubygems.org/.
Recupero di bundler 2.4.1

Tentativo di download della gem da https://rubygems.org/ a causa di un errore (2/4): Bundler::PermissionError Si è verificato un errore durante il tentativo di scrittura in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. È probabile che sia necessario concedere i permessi di scrittura per quel percorso.

Tentativo di download della gem da https://rubygems.org/ a causa di un errore (3/4): Bundler::PermissionError Si è verificato un errore durante il tentativo di scrittura in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. È probabile che sia necessario concedere i permessi di scrittura per quel percorso.

Tentativo di download della gem da https://rubygems.org/ a causa di un errore (4/4): Bundler::PermissionError Si è verificato un errore durante il tentativo di scrittura in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. È probabile che sia necessario concedere i permessi di scrittura per quel percorso.

Si è verificato un errore durante l'installazione della versione bloccata di bundler (2.4.1), riesegui con il flag `--verbose` per maggiori dettagli. Continuo a usare bundler 2.4.2.
Recupero dei metadati delle gem da https://rubygems.org/.........
Recupero di https://github.com/discourse/mail.git
Si è verificato un errore durante il tentativo di scrittura in `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git`.
È probabile che sia necessario concedere i permessi di scrittura per quel percorso.
1 Mi Piace

Ho riscontrato questo problema anch’io.

1 Mi Piace

Ci sono aggiornamenti in merito?

Ciao,\n\nSono completamente nuovo e un principiante. Sto provando a configurare Discourse su Ubuntu 22.04 dev prima di distribuirlo su GitHub e poi sul server (non ho idea di come, ma ora non importa).\n\nHo provato a installare Discourse localmente usando docker (seguendo questo tutorial).\n\nPenso di aver installato correttamente docker, ma quando digito:\n\nsudo d/rails s\n\notterrò "GitHub - discourse/mail: A Really Ruby Mail Library non è ancora stato scaricato. Esegui prima bundle install."\n\ne quando eseguo \n\nsudo d/bundle install \n\notterrò:\n"Fetching https://github.com/discourse/mail.git\nSi è verificato un errore durante il tentativo di scrittura su\n/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git. È probabile che tu debba\nconcedere i permessi di scrittura per quel percorso."\n\nPer favore, consigliami :slight_smile:

Creata una pull request per risolvere questo problema - 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 Mi Piace

Grazie per i report: questo dovrebbe essere risolto da questo commit

La build è in esecuzione e quindi una nuova immagine discourse_dev:release dovrebbe essere caricata entro la prossima ora. Successivamente dovrai eseguire d/shutdown_dev e d/boot_dev per applicare le modifiche.

4 Mi Piace

Come si imposta/assegna a questo container un indirizzo IP statico specifico?

Ciao! Ho avuto lo stesso errore.

Sono riuscito a risolverlo andando in app/assets/javascripts ed eseguendo yarn prima di eseguire d/boot_dev --init.

La mia ipotesi è che d/boot_dev --init presupponga che node_modules esista da qualche parte nella sua esecuzione. Questo fallisce perché non esiste se hai appena clonato il repository.

1 Mi Piace

Dopo aver seguito questo tutorial su Ubuntu 22, d/boot_dev --init termina con il seguente output:

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)

Questo tutorial è ancora aggiornato?

1 Mi Piace

Per eseguire i comandi (d/command) senza sudo, devi aggiungerti al gruppo docker tramite

sudo adduser $(whoami) docker

e accedere nuovamente.

2 Mi Piace

Ciao,
Sto riscontrando esattamente lo stesso problema.

L’ho fatto:
Mi sono aggiunto al gruppo docker e ho riavviato il sistema. Ho verificato con il comando groups che faccio effettivamente parte del gruppo docker.

Ancora questo errore continua a comparire.

Sono su Ubuntu 22.04 e avevo già installato Docker tramite Docker Desktop per altri progetti. L’account utente con cui sto lavorando non ha privilegi di amministratore (non fa parte del gruppo sudo), ma ho accesso a un account che li ha. Tuttavia, non posso usare quell’altro account per il mio lavoro quotidiano.
È un problema?

Hm. Sei su un Ubuntu 22.04 bare metal o lo stai eseguendo come VM WSL?

Bare metal. Ubuntu 22.04 in esecuzione nativamente sul mio laptop di lavoro.

Ho notato quanto segue:
La cartella /src del container è montata su /home/gregor/repos/discourse sulla mia macchina host:

Sulla mia macchina host, dopo aver scaricato la repository git, questa cartella appartiene a me e al mio gruppo:

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/
[...]

Gli script d/* eseguono tutti i comandi all’interno del container Docker come utente discourse (vedi qui). E quell’utente discourse non ha accesso in scrittura a quella cartella /src montata.

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

Posso riprodurre questo problema se accedo al container e provo a creare cartelle al suo interno. Se lo faccio come utente root, ha successo.


Sulla mia macchina host:

Se lo faccio come utente discourse, fallisce:

Tuttavia, non riesco a collegare bene queste informazioni :thinking:

Hm. Eseguo ubuntu 22.04 all’interno di wsl in windows:

Dopo d/shell:

e

$ 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}]

Per caso il tuo UID sull’host è diverso da 1000? Se sì, è lì che si trova il problema. L’utente Discourse all’interno di Docker è UID 1000, quindi i file host devono essere scrivibili dall’UID 1000.

Questo post di SO (https://stackoverflow.com/a/45673309/3628926) mi ha indirizzato nella stessa direzione in cui sei andato tu. Posso confermare che sia il mio utente gregor sulla macchina host sia l’utente discourse nel container hanno lo stesso ID 1000.

Qual è l’output di d/exec ls -lan e echo $UID?

Dopo aver eseguito d/shell:
image
Vedo che tutti i file sono di proprietà di root e non di discourse come nello screenshot.

(Avevo un post precedente che mostrava nobody/nogroup, il che era fuorviante perché ho armeggiato con la creazione di un utente e gruppo discourse sulla mia macchina host, il che non ha avuto successo. Quindi ho eliminato il post)

Indica che tutti i file all’interno di /src sono di proprietà dell’utente root.


(Il gruppo discourse deriva da un tentativo precedente che non è stato fruttuoso)

Grazie mille per il tuo aiuto comunque. Mi sento un po’ stupido, devo perdermi qualche conoscenza sul sistema dei permessi Unix.

Dopo molte ricerche e tentativi, ho scoperto che Docker Desktop su Linux sta causando i problemi di autorizzazione.

L’applicazione Discourse nel container Docker viene eseguita come utente non root, ovvero l’utente discourse. Ma come scritto ad esempio qui e qui:

Docker Desktop su Linux esegue una macchina virtuale e i container verranno eseguiti all’interno di quella macchina virtuale. In tal caso, non è possibile montare la cartella host nello stesso modo nei container, perché è necessario prima montarla nella macchina virtuale.

Quindi, come persona che non è affatto un esperto di Docker, vedo due modi per affrontare questo problema:

(1) Abbandonare Docker Desktop su Linux ed eseguire Docker nativamente invece

Questa sembra essere la soluzione più sostenibile poiché vedo che il container discourse sembra essere progettato per essere utilizzato in questo modo. Sono solo esitante perché poi devo ricordare tutti i comandi per gestire le mie immagini, i container e le risorse. E, essendo uno sviluppatore frontend, preferirei un’interfaccia utente per gestire le cose. Ma immagino di doverlo affrontare come un investimento per imparare di più su Docker.

OPPURE

(2) Modificare la proprietà delle cartelle montate nel container

Sono riuscito a far funzionare questo approccio ed eseguire con successo Discourse localmente da Docker Desktop, tuttavia vedo un sacco di avvisi nel terminale e quindi non sono sicuro di quanto sia sostenibile questa soluzione a lungo termine.

Questo comporta diversi passaggi:

Passaggio 1: Clonare il repository

$ git clone https://github.com/discourse/discourse.git
$ cd discourse

Passaggio 2: Inizializzare il container

Dall’interno della cartella discourse clonata sulla macchina host, eseguire:

$ d/boot_dev

Cosa fa? Vedi qui.
Importante: ometti il flag --init in modo che non venga fatto nulla dopo la creazione del container.

Passaggio 3: Modificare la proprietà delle cartelle

L’utente discourse all’interno del container docker ha l’id 1000. Questa guida presuppone che anche l’utente della tua macchina host abbia lo stesso id. Potrebbe non causare problemi se l’utente della tua macchina host ha un id diverso, ma non posso testarlo e quindi non posso pronunciarmi su questa situazione. Puoi scoprire il tuo id eseguendo id o echo $UID in un terminale Linux.

Dalla tua macchina host, esegui:

# apri una shell nel container docker
$ d/shell

# dovresti già essere in /src, ma per sicurezza:
$ cd /src

# modifica la proprietà di /src all'utente e gruppo discourse
$ chown 1000:1000 .

# modifica la proprietà di tutti i file e cartelle all'interno di /src all'utente e gruppo discourse (non ricorsivamente)
$ chown 1000:1000 *

# modifica ricorsivamente la proprietà di quasi tutte le sottocartelle all'utente e gruppo discourse
# fondamentalmente tutte le cartelle tranne 'database', perché quella appartiene all'utente e gruppo 'postgres'
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor

# verifica che abbia funzionato, dovrebbe mostrare ora l'utente e gruppo discourse
$ ls -l

# esci dal container
$ exit

Passaggio 4: Continuare come al solito

Continua a configurare il container e ad avviare Discourse eseguendo quanto segue dalla tua macchina host:

# installa le gemme
$ d/bundle install

# migra il database
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate

# crea l'utente amministratore
$ d/rake admin:create

# In un terminale:
d/rails s

# E in un terminale separato
d/ember-cli

Nota:
Ho riscontrato alcuni avvisi come questo:
fatal: detected dubious ownership in repository at '/src'
Che deriva dalla virtualizzazione di Docker Desktop su Linux.

Ignora questi avvisi, dalla tua macchina host, esegui:

d/exec git config --global --add safe.directory /src

Perché Docker Desktop per Linux esegue una VM?

3 Mi Piace