Windows10下使用Docker Compose构建Jekyll站点失败求助
我在Windows 10系统中使用docker-compose up命令构建Jekyll站点时失败,报错信息如下:
jekyll 3.8.4 | Error: File exists @ dir_s_mkdir - /jekyll/app/_site/tag/mytags
jekyll 3.8.4 | Error: File exists @ dir_s_mkdir - /jekyll/app/_site/tag/inspire
该项目可在Mac OS上正常运行,我尝试将jekyll-paginate 1.1.0升级至jekyll-paginate-v2 2.0.0,但问题仍未解决。不过使用bundle exec jekyll serve命令可成功构建站点并生成_site文件夹。
相关运行日志、配置及Dockerfile
运行日志
site_1 | 11:49:16 webpack.1 | Entrypoint undefined = ../../app/_layouts/default.html site_1 | 11:49:16 webpack.1 | 4 modules site_1 | 11:49:16 webpack.1 | ��� ���wdm���: Compiled successfully. site_1 | 11:49:39 webpack.1 | ��� ���wdm���: Compiling... site_1 | 11:49:42 jekyll.1 | exited with code 1 site_1 | 11:49:42 system | sending SIGTERM to all processes site_1 | 11:49:44 webpack.1 | 98% after emitting CopyPlugin site_1 | 11:49:44 webpack.1 | exited with code 0
docker-compose.yml配置
version: '3' volumes: app-gems: driver: local services: site: build: context: ./dev dockerfile: Dockerfile volumes: - .:/jekyll/app - app-gems:/usr/local/bundle environment: - NODE_ENV=develop command: ./app/dev/scripts/serve.sh stdin_open: true tty: true
Dockerfile内容
FROM ruby:2.5-stretch as builder ARG APP_URL ENV NODE_VER 8 ENV APP_HOME /app ENV JEKYLL_APP_DIR /app ENV NODE_ENV production RUN sed -i "s/stretch main/stretch main contrib non-free/" /etc/apt/sources.list \ && curl -sL https://deb.nodesource.com/setup_$NODE_VER.x | bash - \ && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" >> /etc/apt/sources.list \ && apt-get update && apt-get install -y libxml2-dev libxslt1-dev unzip imagemagick nodejs cmake yarn \ && npm install -g bower \ && rm -rf /var/lib/apt/lists/* WORKDIR $APP_HOME COPY . . RUN ./dev/scripts/build.sh && cat app/_layouts/default.html FROM nginx:1.14-alpine ENV NGINX_PORT 3000 COPY --from=builder /app/_site /usr/share/nginx/html RUN ls -la /usr/share/nginx/html/
问题分析与解决方案
这个错误的核心是Windows和Linux文件系统的大小写敏感性差异:Mac OS的默认文件系统(APFS)和Windows的NTFS都是大小写不敏感的,但Docker容器内的Linux文件系统是大小写敏感的。当你在Windows上挂载本地目录到容器时,若本地已经存在大小写不同的同名目录(比如MyTags和mytags),容器里的Jekyll尝试创建小写版本时,Windows文件系统会认为目录已存在,从而抛出错误。而bundle exec jekyll serve能成功,大概率是因为这个命令在本地Windows环境运行,系统的大小写不敏感特性自动处理了冲突。
给你几个可行的解决方向:
1. 统一目录/文件的大小写
先在本地Windows的_site/tag目录下检查,是否存在类似MyTags、Inspire这类和报错目录大小写不同的内容。把所有相关目录、文件名统一成和报错一致的格式(比如全小写的mytags、inspire),消除大小写冲突。
2. 调整Docker挂载的大小写敏感设置
如果你的Windows 10版本是1809及以上,且Docker Desktop启用了WSL 2后端,可以在docker-compose.yml的挂载配置里添加大小写不敏感选项:
volumes: - .:/jekyll/app:cached,case=insensitive
这样容器内的文件系统会和Windows保持一致的大小写不敏感特性,避免冲突。
3. 修改构建脚本,提前清理冲突目录
打开./app/dev/scripts/serve.sh,在Jekyll构建命令前添加清理步骤,确保每次构建前删除可能存在的冲突目录:
# 先删除可能存在的冲突目录 rm -rf /jekyll/app/_site/tag/mytags /jekyll/app/_site/tag/inspire # 再执行Jekyll构建命令 bundle exec jekyll build
4. 检查jekyll-paginate-v2的配置
虽然你升级了分页插件,但可能_config.yml里的标签目录配置存在大小写不一致的问题。检查配置中的标签路径:
pagination: tag_dir: 'tag' # 确保这个路径和实际要创建的目录大小写完全一致
内容的提问来源于stack exchange,提问作者Imene HAKEM

