无法通过Docker构建Docusaurus网站:多阶段构建文件复制失败
问题排查与修复方案
先确认Build阶段是否生成了正确的静态文件
首先验证构建阶段的产物是否存在:
- 单独构建build阶段镜像:
docker build --target build -t docusaurus-build -f docker/Dockerfile.docusaurus .
- 运行该镜像进入容器检查:
docker run -it docusaurus-build sh
在容器内执行以下命令:
- 检查本地文档是否正确复制:
ls -la /project/docs - 检查build目录是否生成及内容:
ls -la /project/build
如果build目录为空,说明npm run build未正确执行或失败;如果docs目录没有你本地的md文件,说明COPY命令有误。
修复COPY文档的命令
你当前的COPY ./docs/docusaurus/* docs只会复制./docs/docusaurus下的文件,不会复制子目录,且无法完整同步目录结构。改成以下命令,确保完整复制本地文档目录的所有内容:
COPY ./docs/docusaurus/ ./docs/
这个命令会将本地./docs/docusaurus下的所有文件和子目录,完整复制到容器内的/project/docs目录,替换原有默认文档(如果需要保留默认文档,可单独复制特定文件)。
确保Build阶段成功生成产物
在Build阶段的npm run build后添加验证命令,构建时就能直观看到是否生成了build目录:
RUN npm run build && ls -la /project/build
如果构建时显示build目录为空或不存在,需要检查npm run build是否报错,可能是文档格式问题或依赖缺失。
验证最终镜像的文件复制情况
构建完成后,运行临时容器检查Nginx目录:
docker run --rm docusaurus-doc ls -la /usr/share/nginx/html
如果这里能看到静态文件,说明复制成功,此时启动Nginx服务即可正常访问;如果仍然为空,检查COPY命令的源路径是否正确(确保/project/build在Build阶段确实存在)。
完整修复后的Dockerfile示例
FROM node:16.14-alpine as build RUN npx create-docusaurus@latest project classic WORKDIR /project # 完整复制本地文档目录 COPY ./docs/docusaurus/ ./docs/ # 构建并验证产物 RUN npm run build && ls -la /project/build FROM nginx:1.17.4-alpine as serve RUN echo $'server { \n\n listen 8080; \n\n root /usr/share/nginx/html; \n\n index index.html; \n\n server_name _; \n\n location / { \n\n try_files $uri $uri/ /index.html =404; \n\n } \n\n}' > /etc/nginx/conf.d/default.conf # 复制Build阶段的静态文件到Nginx目录 COPY --from=build /project/build/ /usr/share/nginx/html EXPOSE 8080
内容的提问来源于stack exchange,提问作者Fulvio
相关产品推荐
相关产品推荐

