Install Discourse for development using Docker

J’ai essayé cela sur deux machines et les deux échouent avec une erreur de permission.

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 est en cours d'exécution, mais votre lockfile a été généré avec 2.4.1. Installation de Bundler 2.4.1 et redémarrage en utilisant cette version.
Récupération des métadonnées de gem depuis https://rubygems.org/.
Récupération de bundler 2.4.1

Nouvelle tentative de téléchargement de la gem depuis https://rubygems.org/ en raison d'une erreur (2/4) : Bundler::PermissionError Il y a eu une erreur lors de la tentative d'écriture dans `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Il est probable que vous deviez accorder des permissions d'écriture pour ce chemin.

Nouvelle tentative de téléchargement de la gem depuis https://rubygems.org/ en raison d'une erreur (3/4) : Bundler::PermissionError Il y a eu une erreur lors de la tentative d'écriture dans `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Il est probable que vous deviez accorder des permissions d'écriture pour ce chemin.

Nouvelle tentative de téléchargement de la gem depuis https://rubygems.org/ en raison d'une erreur (4/4) : Bundler::PermissionError Il y a eu une erreur lors de la tentative d'écriture dans `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. Il est probable que vous deviez accorder des permissions d'écriture pour ce chemin.

Il y a eu une erreur lors de l'installation de la version verrouillée de bundler (2.4.1), réexécutez avec le drapeau `--verbose` pour plus de détails. Continuer en utilisant bundler 2.4.2.
Récupération des métadonnées de gem depuis https://rubygems.org/.........
Récupération de https://github.com/discourse/mail.git
Il y a eu une erreur lors de la tentative d'écriture dans `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git`.
Il est probable que vous deviez accorder des permissions d'écriture pour ce chemin.
1 « J'aime »

J’ai aussi rencontré ce problème.

1 « J'aime »

Des nouvelles à ce sujet ?

Bonjour,

Je suis complètement nouveau et novice. J’essaie de configurer Discourse sur une Ubuntu 22.04 de développement avant de le déployer sur GitHub, puis sur un serveur (je n’ai aucune idée de comment faire, mais ça n’a pas d’importance pour l’instant).

J’ai essayé d’installer Discourse localement en utilisant Docker (en suivant ce tutoriel).

Je pense avoir correctement installé Docker, mais lorsque je tape :

sudo d/rails s

J’obtiens : “GitHub - discourse/mail: A Really Ruby Mail Library n’est pas encore extrait. Exécutez d’abord bundle install.”

Et lorsque j’exécute :

sudo d/bundle install

J’obtiens : “Récupération de GitHub - discourse/mail: A Really Ruby Mail Library
Une erreur s’est produite lors de la tentative d’écriture dans
/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git. Il est probable que vous ayez besoin
d’accorder des permissions d’écriture pour ce chemin.”

S’il vous plaît, donnez-moi des conseils :slight_smile:

Créé une pull request pour corriger cela - 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 « J'aime »

Merci pour les rapports - cela devrait être corrigé par ce commit

La construction est en cours et une nouvelle image discourse_dev:release devrait donc être poussée dans l’heure qui suit. Après cela, vous devrez exécuter d/shutdown_dev et d/boot_dev pour appliquer les modifications.

4 « J'aime »

Comment attribuer/donner à ce conteneur une adresse IP statique spécifique ?

Salut ! J’ai eu la même erreur.

J’ai réussi à la corriger en allant dans app/assets/javascripts et en exécutant yarn avant d’exécuter d/boot_dev --init.

Mon hypothèse est que d/boot_dev --init suppose que node_modules existe quelque part dans son exécution. Cela échoue car ce n’est pas le cas si vous venez de cloner le dépôt.

1 « J'aime »

Après avoir suivi ce tutoriel sur Ubuntu 22, d/boot_dev --init se termine avec la sortie suivante :

Migration de la base de données...
rake a échoué !
Discourse::Utils::CommandError : /src/lib/discourse.rb :137 :in `exec' : mkdir : impossible de créer le répertoire « /src/public/plugins/ » : Permission refusée
/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>'
(Voir la trace complète en exécutant la tâche avec --trace)

Ce tutoriel est-il toujours à jour ?

1 « J'aime »

Pour exécuter les commandes (d/command) sans sudo, vous devez vous ajouter au groupe docker via

sudo adduser $(whoami) docker

et vous reconnecter.

2 « J'aime »

Salut,
J’ai exactement le même problème.

Je l’ai fait :
Je me suis ajouté au groupe docker et j’ai redémarré le système. J’ai vérifié avec la commande groups que je faisais bien partie du groupe docker.

Cette erreur continue d’apparaître.

Je suis sur Ubuntu 22.04 et j’avais déjà installé Docker via Docker Desktop pour d’autres projets. Le compte utilisateur avec lequel je travaille n’a pas de privilèges d’administrateur (ne fait pas partie du groupe sudo), mais j’ai accès à un compte qui en a. Cependant, je ne peux pas utiliser cet autre compte pour mon travail quotidien.
Est-ce un problème ?

Hm. Êtes-vous sur un Ubuntu 22.04 bare metal ou l’exécutez-vous en tant que VM WSL ?

Bare metal. Ubuntu 22.04 fonctionnant nativement sur mon ordinateur portable de travail.

J’ai remarqué ce qui suit :
Le dossier /src du conteneur est monté sur /home/gregor/repos/discourse sur ma machine hôte :

Sur ma machine hôte, après avoir cloné le dépôt git, ce dossier m’appartient ainsi qu’à mon groupe :

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

Les scripts d/* exécutent toutes les commandes à l’intérieur du conteneur Docker en tant qu’utilisateur discourse (voir ici). Et cet utilisateur discourse n’a pas les droits d’écriture sur ce dossier /src monté.

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

Je peux reproduire cela si je me connecte au conteneur et que j’essaie de créer des dossiers. Si je le fais en tant qu’utilisateur root, cela réussit.


Sur ma machine hôte :

Si je le fais en tant qu’utilisateur discourse, cela échoue :

Cependant, je n’arrive pas tout à fait à relier tout cela :thinking:

Hm. J’exécute Ubuntu 22.04 dans WSL sous Windows :

Après d/shell :

et

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

Votre UID sur l’hôte est-il différent de 1000 par hasard ? Si c’est le cas, c’est là que se situe le problème. L’utilisateur Discourse à l’intérieur de Docker est l’UID 1000, donc les fichiers hôtes doivent être inscriptibles par l’UID 1000.

Ce post SO m’a mis sur la même piste que vous. Je peux confirmer que mon utilisateur gregor sur la machine hôte et l’utilisateur discourse dans le conteneur ont le même ID 1000.

Quel est le résultat de d/exec ls -lan et echo $UID ?

Après avoir exécuté d/shell :
image
Je vois que tous les fichiers appartiennent à root et non à discourse comme sur votre capture d’écran.

(J’ai eu un post précédent qui montrait nobody/nogroup, ce qui était trompeur car j’avais bricolé en créant un utilisateur et un groupe discourse sur ma machine hôte, ce qui n’a pas abouti. J’ai donc supprimé le post)

Indique que tous les fichiers à l’intérieur de /src appartiennent à l’utilisateur root.


(Le groupe discourse provient d’une tentative antérieure qui n’a pas été fructueuse)

Merci beaucoup pour votre aide au passage. Je me sens un peu stupide, je dois manquer de connaissances sur le système de permissions Unix.

Après de nombreuses recherches et expérimentations, j’ai découvert que Docker Desktop sur Linux est à l’origine des problèmes de permissions.

En effet, l’application Discourse dans le conteneur Docker s’exécute en tant qu’utilisateur non root, à savoir l’utilisateur discourse. Mais comme écrit par exemple ici et ici :

Docker Desktop sur Linux exécute une machine virtuelle et les conteneurs s’exécuteront à l’intérieur de cette machine virtuelle. Dans ce cas, vous ne pouvez pas simplement monter le dossier hôte de la même manière dans les conteneurs, car vous devez d’abord le monter dans la machine virtuelle.

Ainsi, en tant que personne qui n’est en aucun cas une experte en Docker, je vois deux façons de résoudre ce problème :

(1) Abandonner Docker Desktop sur Linux et exécuter Docker nativement à la place

Cela semble être la solution la plus durable car je vois que le conteneur discourse semble être conçu pour être utilisé de cette manière. Je suis seulement hésitant car je devrai alors me souvenir de toutes les commandes pour gérer mes images, conteneurs et ressources. Et, étant un développeur frontend, je préférerais une interface utilisateur pour gérer les choses. Mais je suppose que je dois aborder cela comme un investissement pour en apprendre davantage sur Docker.

OU

(2) Changer la propriété des dossiers montés dans le conteneur

J’ai réussi à faire fonctionner cette approche et à exécuter Discourse avec succès localement depuis Docker Desktop, cependant je vois un tas d’avertissements dans le Terminal et je ne suis donc pas sûr de la durabilité de cette solution à long terme.

Cela implique plusieurs étapes :

Étape 1 : Cloner le dépôt

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

Étape 2 : Initialiser le conteneur

Depuis le dossier discourse cloné sur la machine hôte, exécutez :

$ d/boot_dev

Que fait-il ? Voir ici.
Important : Omettez le drapeau --init afin que rien ne soit fait après la création du conteneur.

Étape 3 : Changer la propriété des dossiers

L’utilisateur discourse dans le conteneur docker a l’id 1000. Ce guide suppose que l’utilisateur de votre machine hôte a également le même id. Cela pourrait ne pas poser de problème si l’utilisateur de votre machine hôte a un id différent, mais je ne peux pas tester cela et donc je ne peux pas me prononcer sur cette situation. Vous pouvez trouver votre id en exécutant id ou echo $UID dans un terminal Linux.

Depuis votre machine hôte, exécutez :

# ouvrez un shell dans le conteneur docker
$ d/shell

# vous devriez déjà être dans /src, mais juste pour être sûr :
$ cd /src

# changez la propriété de /src à l'utilisateur et au groupe discourse
$ chown 1000:1000 .

# changez la propriété de tous les fichiers et dossiers dans /src à l'utilisateur et au groupe discourse (non récursivement)
$ chown 1000:1000 *

# changez récursivement la propriété de presque tous les sous-dossiers à l'utilisateur et au groupe discourse
# essentiellement tous les dossiers sauf 'database', car celui-ci appartient à l'utilisateur et au groupe 'postgres'
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor

# vérifiez que cela a fonctionné, devrait maintenant afficher l'utilisateur et le groupe discourse
$ ls -l

# quittez le conteneur
$ exit

Étape 4 : Continuez comme d’habitude

Continuez à configurer le conteneur et à démarrer Discourse en exécutant ce qui suit depuis votre machine hôte :

# installez les gems
$ d/bundle install

# migrez la base de données
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate

# créez un utilisateur administrateur
$ d/rake admin:create

# Dans un terminal :
d/rails s

# Et dans un terminal séparé
d/ember-cli

Remarque :
J’ai rencontré certains avertissements comme celui-ci :
fatal: detected dubious ownership in repository at '/src'
Qui provient de la virtualisation de Docker Desktop sur Linux.

Ignorez ces avertissements, depuis votre machine hôte, exécutez :

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

Pourquoi Docker Desktop pour Linux exécute-t-il une VM ?

3 « J'aime »