FROM denoland/deno:latest | |
WORKDIR /app | |
# 设置环境变量,阻止 Deno 更新检查和交互式提示 | |
ENV DENO_NO_UPDATE_CHECK=1 | |
ENV DENO_NO_PROMPT=1 | |
# 关键改动1: 提前创建 /deno-dir 并尝试设置权限。 | |
# 即使 chown 失败 (|| true 忽略错误),也能确保目录存在,并让 root 用户能写入。 | |
RUN mkdir -p /deno-dir && chown -R deno:deno /deno-dir || true | |
# 关键改动2: 极其彻底地清理 WORKDIR,确保没有残留。 | |
# 这会删除 /app 目录下的所有内容,提供一个完全干净的环境。 | |
# 请注意,这会删除所有文件,包括隐藏文件和目录。 | |
RUN rm -rf /app/* /app/.* 2>/dev/null || true | |
# 复制你的应用文件到 /app 目录。 | |
COPY . . | |
# 注意:我们不再尝试 chown /app 整个目录,因为这在 Hugging Face Spaces 上会导致权限错误。 | |
# 这意味着 /app 下的应用程序文件(如 main.ts)将由 root 用户拥有。 | |
# 关键步骤:以 root 用户执行 deno cache 命令。 | |
# 这样它就有权限在 /app/node_modules/.deno 或 /deno-dir 中写入所需的依赖。 | |
RUN deno cache --reload --quiet --node-modules-dir main.ts | |
EXPOSE 8000 | |
# 运行时,将用户切换回 'deno'。 | |
# 这增加了运行时的安全性,因为应用程序将以非 root 权限运行。 | |
# 如果你的应用在运行时需要写入由 root 拥有的文件,可能需要移除此行。 | |
USER deno | |
CMD ["deno", "run", "--allow-net", "--allow-env", "--node-modules-dir", "main.ts"] |