使用 Docker 安装 Discourse 用于开发

经过大量研究和反复试验,我了解到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 个赞