我找到了一个解决我问题的方法。这个方法有点复杂和取巧,但它确实有效。总而言之,升级到 Node.js 20.x.x 解决了我的问题。
我创建了一个 Docker 镜像,它使用 Node.js v20.x.x 而不是 Discourse 开发 Docker 镜像默认使用的 v18.x.x。
我首先创建了这个 Dockerfile:
# NAME: discourse_node20
FROM discourse/discourse_dev:release
# 升级 node 到 LTS 20.x.x
ENV NODE_MAJOR=20
RUN apt-get update
RUN apt-get install -y ca-certificates curl gnupg
RUN mkdir -p /etc/apt/keyrings
RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
RUN apt-get update
RUN apt-get install nodejs -y
然后我构建了镜像:docker build -t discourse_node20 - < Dockerfile
然后我更新了 d/boot_dev 的 docker run 命令,使其使用 discourse_node20 镜像,并且 不 拉取 discourse/discourse_dev:release,因为它不再被使用。这是 d/boot_dev 中更新后的命令:
# 注释掉下面这行
# docker pull discourse/discourse_dev:release
docker run \
-d \
-p $local_publish:8025:8025 \
-p $local_publish:3000:3000 \
-p $local_publish:4200:4200 \
-p $local_publish:9292:9292 \
-p $local_publish:9405:9405 \
-v "$DATA_DIR:/shared/postgres_data:delegated" \
-v "$SOURCE_DIR:/src:delegated" \
-e UNICORN_BIND_ALL=true \
-e NODE_OPTIONS=--max_old_space_size=8192 \
$mount_plugin_symlinks \
$ENV_ARGS \
--hostname=discourse \
--name=discourse_dev \
--restart=always \
discourse_node20 /sbin/boot
从那里,我成功地运行了 d/boot_dev --init、d/rails s 和 d/ember-cli,在 Docker 24 和 Fedora 39 中得到了一个可用的开发环境。
我不知道 Node 20.x.x 为什么 能解决这个问题。希望主开发镜像中的这个问题能被修复。我很乐意贡献一个拉取请求,但升级一个主要依赖项似乎超出了我随意提交一个拉取请求的范围。
至少我现在可以继续工作了!