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?