Developing Discourse using a Dev Container

那些非 VS Code 的说明刚才在 macOS 上对我并不奏效。我推荐希望在与 VS Code 无关的情况下与 Discourse Docker 镜像交互的 macOS 用户,改用传统的 boot_dev Docker 脚本。

通过 docker ps,我找到了容器名称(一个随机生成的滑稽名称,例如 peaceful_lumiere)。我运行了 docker inspect peaceful_lumiere | jq '.[0].NetworkSettings.Networks.bridge.IPAddress',它输出了一个 IP 地址。我在浏览器中访问 http://<ip>:4200,但它一直转圈,永远无法加载。

我认为这是因为 ember-cli 开发服务器并未监听所有网络接口;它仅在容器内部监听 http://127.0.0.1:4200

最终,我通过向 .devcontainer/devcontainer.json 添加一个 runArgs 部分解决了问题,如下所示:

     8025, // mailhog
     9229  // chrome remote debug
   ],
+  "runArgs": [
+    "-p",
+    "127.0.0.1:4200:4200",
+    "-p",
+    "127.0.0.1:3000:3000",
+    "-p",
+    "127.0.0.1:9292:9292",
+    "-p",
+    "127.0.0.1:8025:8025",
+    "-p",
+    "127.0.0.1:9229:9229"
+  ],
   "remoteUser": "discourse",
   "remoteEnv": {
     "RAILS_DEVELOPMENT_HOSTS": ".app.github.dev",

……但如果你这样做,它在 VS Code 中将无法工作(因为 VS Code 和开发容器都会尝试转发端口)。我创建了一个单独的 devcontainer-cli.json 文件,并使用 devcontainer --override-config .devcontainer/devcontainer-cli.json 命令,结果成功了。

但随后我恍然大悟:我折腾了这么多,结果却并不比直接使用现有的传统 boot_dev 脚本更好。按照文档步骤操作,比试图通过 CLI 强行让 devcontainer 做正确的事情要更快、更简单。

开发容器(Dev Containers)主要是为在 VS Code 或某种能自动管理端口转发的工具中使用而设计的;devcontainer CLI 并不具备此功能。因此,如果你不想使用 VS Code,或许就不要折腾开发容器了。