Install Discourse for development using Docker

我在两台机器上都试过了,都出现了权限错误。

pfaffman@shinytim:~/src/discourse-repos/discourse$ d/bundle install
Bundler 2.4.2 正在运行,但您的 lockfile 是使用 2.4.1 生成的。正在安装 Bundler 2.4.1 并使用该版本重新启动。
正在从 https://rubygems.org/ 获取 gem 元数据。
正在获取 bundler 2.4.1

由于错误 (2/4):Bundler::PermissionError,正在重试从 https://rubygems.org/ 下载 gem。写入 `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem` 时出错。您很可能需要授予该路径的写入权限。

由于错误 (3/4):Bundler::PermissionError,正在重试从 https://rubygems.org/ 下载 gem。写入 `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem` 时出错。您很可能需要授予该路径的写入权限。

由于错误 (4/4):Bundler::PermissionError,正在重试从 https://rubygems.org/ 下载 gem。写入 `/usr/local/lib/ruby/gems/3.1.0/cache/bundler-2.4.1.gem` 时出错。您很可能需要授予该路径的写入权限。

安装锁定的 bundler 版本 (2.4.1) 时出错,请使用 `--verbose` 标志重新运行以获取更多详细信息。继续使用 bundler 2.4.2。
正在从 https://rubygems.org/ 获取 gem 元数据.........
正在获取 https://github.com/discourse/mail.git
写入 `/usr/local/lib/ruby/gems/3.1.0/cache/bundler/git` 时出错。
您很可能需要授予该路径的写入权限。
1 个赞

我也遇到了这个问题。

1 个赞

有关于此事的任何更新吗?

你好,

我是完全的新手。我尝试在开发环境的 Ubuntu 22.04 上配置 Discourse,然后再部署到 GitHub,最后部署到服务器(虽然不知道如何做,但现在不重要)。

我尝试使用 Docker 在本地安装 Discourse(使用了这个教程)。

我认为我正确安装了 Docker,但当我输入:

sudo d/rails s

时,我得到“GitHub - discourse/mail: A Really Ruby Mail Library 尚未检出。请先运行 bundle install。”

当我运行:

sudo d/bundle install

时,我得到:“Fetching GitHub - discourse/mail: A Really Ruby Mail Library
在尝试写入 /usr/local/lib/ruby/gems/3.1.0/cache/bundler/git 时发生错误。您可能需要为此路径授予写入权限。”

请指导一下 :slight_smile:

已创建拉取请求以修复此问题 - 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 个赞

感谢提供的报告 - 此提交应该已经修复了这个问题

构建正在运行,因此 discourse_dev:release 的新镜像应该会在一小时内推送。之后,您需要运行 d/shutdown_devd/boot_dev 来获取更改。

4 个赞

如何为该容器设置/分配特定的静态 IP 地址?

您好!我遇到了同样的错误。

我通过进入 app/assets/javascripts 目录并运行 yarn,然后再运行 d/boot_dev --init 来解决了这个问题。

我的假设是 d/boot_dev --init 在执行时会假定 node_modules 存在。如果您刚刚克隆了仓库,这就会失败,因为 node_modules 不存在。

1 个赞

在按照 Ubuntu 22 上的本教程操作后,d/boot_dev --init 以以下输出结束:

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)

本教程是否仍然是最新的?

1 个赞

要执行命令(d/command),而无需 sudo,您必须将自己添加到 docker 组中,方法是:

sudo adduser $(whoami) docker

然后重新登录。

2 个赞

您好,
我遇到了完全相同的问题。

我已经这样做了:
我已将自己添加到 docker 组并重新启动了系统。我通过 groups 命令验证了我确实是 docker 组的成员。

但此错误仍然出现。

我使用的是 Ubuntu 22.04,并且已经通过 Docker Desktop 为其他项目安装了 Docker。我正在使用的用户帐户没有管理员权限(不是 sudo 组的成员),但我有一个具有管理员权限的帐户。但我不能使用那个其他帐户进行日常工作。
这有问题吗?

嗯。您是在裸机 Ubuntu 22.04 上运行,还是在 WSL 虚拟机中运行?

裸机。Ubuntu 22.04 在我的工作笔记本电脑上原生运行。

我注意到以下几点:
容器的 /src 文件夹已挂载到我的主机上的 /home/gregor/repos/discourse

在我的主机上,在拉取 git 仓库后,该文件夹属于我和我的组:

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

d/* 脚本以 discourse 用户身份在 docker 容器内执行所有命令(参见此处)。而该 discourse 用户对挂载的 /src 文件夹没有写入权限。

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

如果我登录到容器并尝试在其中创建文件夹,我可以重现此问题。如果我以 root 用户身份执行,则成功。


在我的主机上:

如果我以 discourse 用户身份执行,则失败:

但是,我无法将这些联系起来 :thinking:

Hm. I run ubuntu 22.04 inside wsl in windows:

After d/shell:

and

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

您的主机上的 UID 是否与 1000 不同?如果是,那就是问题所在。Docker 内的 Discourse 用户是 UID 1000,因此主机文件需要可被 UID 1000 写入。

This SO post 已经暗示了我和你一样的方向。我可以确认,在宿主机上的我的 gregor 用户和容器中的 discourse 用户拥有相同的 ID 1000。

d/exec ls -lanecho $UID 的输出是什么?

运行 d/shell 后:
image
我看到所有文件都归 root 所有,而不是像您截图中的 discourse。

(我之前有一个帖子显示 nobody/nogroup,那具有误导性,因为我尝试在我的主机上创建 discourse 用户和组,但没有成功。所以我删除了那个帖子)

指示 /src 中的所有文件都归 root 用户所有。


(discourse 组来自早期不成功的尝试)

另外,非常感谢您的帮助。我感觉有点愚蠢,一定是我对 Unix 权限系统有些知识盲区。

经过大量研究和反复试验,我了解到Linux 上的 Docker Desktop 导致了权限问题。

您知道,Docker 容器中的 Discourse 应用程序是以非 root 用户运行的,即 discourse 用户。但正如此处此处所写:

Linux 上的 Docker Desktop 运行一个虚拟机,容器将在该虚拟机中运行。在这种情况下,您不能像平常一样将主机文件夹挂载到容器中,因为您需要先将其挂载到虚拟机中。

因此,作为一个并非 Docker 专家的人,我认为有两种方法可以解决这个问题:

(1) 放弃 Linux 上的 Docker Desktop,改为原生运行 Docker

这似乎是最可持续的解决方案,因为我认为 Discourse 容器的设计就是这样使用的。我之所以犹豫,是因为我必须记住管理镜像、容器和资源的所有命令。而且,作为一名前端开发人员,我更喜欢一个 UI 来管理事物。但我想我必须将其视为一项投资,以更多地了解 Docker。

或者

(2) 更改挂载到容器中的文件夹的所有权

我设法让这种方法奏效,并成功地从 Docker Desktop 在本地运行了 Discourse,但是我在终端中看到了一堆警告,因此我不确定这种解决方案的长期可持续性。

这涉及几个步骤:

步骤 1:克隆仓库

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

步骤 2:初始化容器

在主机上的克隆的 discourse 文件夹内执行:

$ d/boot_dev

它做了什么?请参阅此处
重要提示:省略 --init 标志,这样在容器创建后将不会执行任何操作。

步骤 3:更改文件夹的所有权

Docker 容器内的 discourse 用户 ID 为 1000。本指南假定您的主机用户的 ID 也相同。如果您的主机用户的 ID 不同,可能不会破坏事物,但我无法测试,因此无法就这种情况发表评论。您可以通过在 Linux 终端中执行 idecho $UID 来查找您的 ID。

从您的主机执行:

# 在 docker 容器中打开一个 shell
$ d/shell

# 您应该已经在 /src 中了,但为了以防万一:
$ cd /src

# 将 /src 的所有权更改为 discourse 用户和组
$ chown 1000:1000 .

# 将 /src 中所有文件和文件夹的所有权更改为 discourse 用户和组(非递归)
$ chown 1000:1000 *

# 递归地将几乎所有子文件夹的所有权更改为 discourse 用户和组
# 基本上除了 'database' 之外的所有文件夹,因为那个属于 'postgres' 用户和组
$ chown -R 1000:1000 app bin config d db docs documentation images lib log plugins public script spec test vendor

# 验证是否成功,现在应该显示 discourse 用户和组
$ ls -l

# 离开容器
$ exit

步骤 4:照常继续

通过从主机执行以下命令,继续设置容器并启动 Discourse:

# 安装 gem
$ d/bundle install

# 迁移数据库
$ d/rake db:migrate
$ RAILS_ENV=test d/rake db:migrate

# 创建管理员用户
$ d/rake admin:create

# 在一个终端中:
d/rails s

# 并在单独的终端中
d/ember-cli

注意:
我遇到了一些警告,例如:
fatal: detected dubious ownership in repository at '/src'
这是由 Linux 上的 Docker Desktop 虚拟化引起的。

请忽略这些警告,从您的主机执行:

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

为什么 Docker Desktop for Linux 运行 VM?

3 个赞