Docker compose 不具备所需的功能。Discourse 的 docker 文件模板构建允许灵活的 docker 结果。使用 compose,你只有一套可能的固定 Dockerfiles,这可能导致大量容器。
在我的 Discourse 设置中,我使用一个容器,其中 Discourse 和 nginx 使用 UNIX 套接字。PostgreSQL 和 Redis 是主机上的服务。这与默认设置有很大不同,但它是开箱即用的。
使用 compose 部分可行,也许可以通过那个设计不佳的 profile 功能来实现。但即使那样,它也很混乱。或者你需要为每种变体提供不同的 compose 文件。
你只是在转移问题。
一个干净的 Discourse compose 设置将是以下服务在单独的容器中:
- Discourse
- nginx
- PostgreSQL
- Redis
Discourse 和 nginx 需要共享一个卷,这没什么大不了的。
PostgreSQL 和 Redis……这些是你可能想托管在别处的东西,而不是为它们提供一个 Discourse 特定的容器。现在 docker compose 成了一个问题 docker compose up -d 将会启动你不需要的 PostgreSQL。好的,所以我们将其设置为 docker compose --profile postgresql up -d 来启动基本的 discourse 设置和一个 postgresql 容器。对于“完整”的自包含 Discourse 容器设置,使用 docker compose --profile postgresql --profile redis up -d。你最好不要忘记 --profile ... 参数,否则你会遇到更多问题。
所以为了更好的用户体验,你创建一个启动器来负责创建所需的 docker compose 命令。现在我们又回到了原点。除了对 nginx 容器的修改还不可能实现。所以我需要一个 nginx-http 容器和一个 nginx-unix 容器,它们应该是互斥的吗?……
当然,插件管理可以做得更好,但用 docker compose 来做这件事,那将是地狱。