Install Discourse for development using Docker

Já tentei isso em duas máquinas e ambas estão falhando com um erro de permissão.

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 está em execução, mas seu lockfile foi gerado com 2.4.1. Instalando Bundler 2.4.1 e reiniciando usando essa versão.
Buscando metadados de gem de https://rubygems.org/.
Buscando bundler 2.4.1

Tentando baixar gem de https://rubygems.org/ novamente devido a erro (2/4): Bundler::PermissionError Houve um erro ao tentar escrever em `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. É provável que você precise conceder permissões de gravação para esse caminho.

Tentando baixar gem de https://rubygems.org/ novamente devido a erro (3/4): Bundler::PermissionError Houve um erro ao tentar escrever em `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. É provável que você precise conceder permissões de gravação para esse caminho.

Tentando baixar gem de https://rubygems.org/ novamente devido a erro (4/4): Bundler::PermissionError Houve um erro ao tentar escrever em `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem`. É provável que você precise conceder permissões de gravação para esse caminho.

Houve um erro ao instalar a versão bloqueada do bundler (2.4.1), execute novamente com a flag `--verbose` para mais detalhes. Continuando a usar o bundler 2.4.2.
Buscando metadados de gem de https://rubygems.org/.........
Buscando https://github.com/discourse/mail.git
Houve um erro ao tentar escrever em `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git`.
É provável que você precise conceder permissões de gravação para esse caminho.
1 curtida

Eu também encontrei este problema.

1 curtida

Alguma atualização sobre isso?

Olá,\n\nSou totalmente novo e iniciante. Estou tentando configurar o Discourse no Ubuntu 22.04 de desenvolvimento antes de implantar no GitHub e depois no servidor (não tenho ideia de como, mas agora isso não importa)\n\nTentei instalar o Discourse localmente usando o docker (seguindo este tutorial).\n\nAcho que instalei o docker corretamente, mas quando digito:\n\nsudo d/rails s\n\nEu recebo "GitHub - discourse/mail: A Really Ruby Mail Library ainda não foi clonado. Execute bundle install primeiro."\n\nE quando executo \n\nsudo d/bundle install \n\nEu recebo:\n"Buscando https://github.com/discourse/mail.git\nOcorreu um erro ao tentar escrever em\n/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git. É provável que você precise\nconceder permissões de escrita para esse caminho."\n\nPor favor, me ajude :slight_smile:

Criei um pull request para corrigir isso - 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 curtida

Obrigado pelos relatórios - isso deve ser corrigido por este commit

A compilação está em execução e, portanto, uma nova imagem discourse_dev:release deve ser enviada dentro da próxima hora. Depois disso, você precisará executar d/shutdown_dev e d/boot_dev para aplicar as alterações.

4 curtidas

Como definir/dar a este contêiner um endereço IP estático específico?

Olá! Tive o mesmo erro.

Consegui corrigi-lo acessando app/assets/javascripts e executando yarn antes de executar d/boot_dev --init.

Minha hipótese é que d/boot_dev --init assume que node_modules existe em algum lugar em sua execução. Isso falha porque não existe se você acabou de clonar o repositório.

1 curtida

Após seguir este tutorial no Ubuntu 22, o d/boot_dev --init termina com a seguinte saída:

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)

Este tutorial ainda está atualizado?

1 curtida

Para executar os comandos (d/command) sem sudo, você precisa se adicionar ao grupo docker via

sudo adduser $(whoami) docker

e fazer login novamente.

2 curtidas

Olá,
Estou tendo exatamente o mesmo problema.

Eu fiz isso:
Adicionei-me ao grupo docker e reiniciei o sistema. Verifiquei com o comando groups que realmente faço parte do grupo docker.

Ainda assim, este erro continua aparecendo.

Estou no Ubuntu 22.04 e já tinha o docker instalado via docker desktop para outros projetos. A conta de usuário que estou usando não tem privilégios de administrador (não faz parte do grupo sudo), mas tenho acesso a uma conta que tem. No entanto, não posso usar essa outra conta para o meu trabalho diário.
Isso é um problema?

Hum. Você está em um Ubuntu 22.04 bare metal ou executando-o como uma VM WSL?

Bare metal. Ubuntu 22.04 rodando nativamente no meu laptop de trabalho.

Notei o seguinte:
A pasta /src do contêiner é montada em /home/gregor/repos/discourse na minha máquina host:

Na minha máquina host, após puxar o repositório git, esta pasta pertence a mim e ao meu 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/
[...]

Os scripts d/* executam todos os comandos dentro do contêiner docker como o usuário discourse (veja aqui). E esse usuário discourse não tem acesso de escrita à pasta /src montada.

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

Posso reproduzir isso se eu fizer login no contêiner e tentar criar pastas lá. Se eu fizer isso como o usuário root, funciona.


Na minha máquina host:

Se eu fizer isso como o usuário discourse, falha:

No entanto, não consigo conectar isso direito :thinking:

Hm. Eu executo o Ubuntu 22.04 dentro do WSL no Windows:

Após 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}]

Seu UID no host é diferente de 1000 por acaso? Se for, é aí que está o problema. O usuário Discourse dentro do Docker é UID 1000, então os arquivos do host precisam ser graváveis pelo UID 1000.

Esta postagem do SO me deu uma dica na mesma direção que você. Posso confirmar que tanto meu usuário gregor na máquina host quanto o usuário discourse no contêiner têm o mesmo ID 1000.

Qual é a saída de d/exec ls -lan e echo $UID?

Após executar d/shell:
image
Vejo que todos os arquivos pertencem ao root e não ao discourse, como na sua captura de tela.

(Eu tive uma postagem anterior que mostrava nobody/nogroup, o que foi enganoso porque mexi na criação de um usuário e grupo discourse na minha máquina host, o que não levou a nenhum sucesso. Então eu deletei a postagem)

Indica que todos os arquivos dentro de /src pertencem ao usuário root.


(O grupo discourse vem de uma tentativa anterior que não foi frutífera)

Muito obrigado pela sua ajuda, aliás. Sinto-me um pouco estúpido, devo estar a perder algum conhecimento sobre o sistema de permissões Unix.

Após muita pesquisa e experimentação, aprendi que o Docker Desktop no Linux está causando os problemas de permissão.

Veja bem, o aplicativo Discourse no contêiner Docker é executado como um usuário não root, especificamente o usuário discourse. Mas, como escrito, por exemplo, aqui e aqui:

O Docker Desktop no Linux executa uma máquina virtual e os contêineres serão executados dentro dessa máquina virtual. Nesse caso, você não pode simplesmente montar a pasta do host da mesma forma nos contêineres, porque você precisa montá-la primeiro na máquina virtual.

Portanto, como alguém que de forma alguma é um especialista em Docker, vejo duas maneiras de abordar esse problema:

(1) Abandonar o Docker Desktop no Linux e executar o Docker nativamente em vez disso

Esta parece ser a solução mais sustentável, pois vejo que o contêiner discourse parece ser projetado para ser usado dessa forma. Hesito apenas porque então terei que lembrar todos os comandos para gerenciar minhas imagens, contêineres e recursos. E, sendo um desenvolvedor frontend, eu preferiria ter uma interface gráfica para gerenciar as coisas. Mas acho que tenho que encarar isso como um investimento para aprender mais sobre Docker.

OU

(2) Alterar a propriedade das pastas montadas no contêiner

Consegui fazer essa abordagem funcionar e executar o Discourse com sucesso localmente a partir do Docker Desktop, no entanto, vejo uma série de avisos no Terminal e, portanto, não tenho certeza de quão sustentável essa solução é a longo prazo.

Isso envolve várias etapas:

Etapa 1: Clonar o Repositório

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

Etapa 2: Inicializar o Contêiner

Dentro da pasta discourse clonada na máquina host, execute:

$ d/boot_dev

O que ele faz? Veja aqui.
Importante: Omita a flag --init para que nada seja feito após a criação do contêiner.

Etapa 3: Alterar a propriedade das pastas

O usuário discourse dentro do contêiner docker tem o id 1000. Este guia assume que o usuário da sua máquina host também tem o mesmo id. Pode não quebrar as coisas se o usuário da sua máquina host tiver um id diferente, mas não posso testar isso e, portanto, não posso falar sobre essa situação. Você pode descobrir seu id executando id ou echo $UID em um terminal Linux.

Da sua máquina host, execute:

# abra um shell no contêiner docker
$ d/shell

# você já deve estar em /src, mas só para garantir:
$ cd /src

# altere a propriedade de /src para o usuário e grupo discourse
$ chown 1000:1000 .

# altere a propriedade de todos os arquivos e pastas dentro de /src para o usuário e grupo discourse (não recursivamente)
$ chown 1000:1000 *

# altere recursivamente a propriedade de quase todas as subpastas para o usuário e grupo discourse
# basicamente todas as pastas exceto 'database', porque essa pertence ao usuário e grupo 'postgres'
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor

# verifique se funcionou, agora deve mostrar o usuário e grupo discourse
$ ls -l

# saia do contêiner
$ exit

Etapa 4: Continue normalmente

Continue configurando o contêiner e iniciando o Discourse executando o seguinte da sua máquina host:

# instale gems
$ d/bundle install

# migre o banco de dados
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate

# crie o usuário administrador
$ d/rake admin:create

# Em um terminal:
d/rails s

# E em um terminal separado
d/ember-cli

Observação:
Enfrentei alguns avisos como este:
fatal: detected dubious ownership in repository at '/src'
Que vem da coisa de virtualização do Docker Desktop no Linux.

Ignore esses avisos, da sua máquina host, execute:

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

Por que o Docker Desktop para Linux executa uma VM?

3 curtidas