GitHub Action调用Pandoc Docker执行脚本报错的排查与修复
问题修复方案
错误根源解析
- 镜像ENTRYPOINT冲突:pandoc/latex官方镜像默认ENTRYPOINT是
pandoc,直接传递bash ./pandoc.sh会被当成pandoc的命令参数,导致pandoc尝试读取名为bash的文件,触发does not exist错误。 - 脚本语法与逻辑错误:原
pandoc.sh中GNU Parallel的命令格式错误,变量引用、循环写法不符合parallel的语法要求,且未正确处理多文件参数。 - 文件列表传递失效:PowerShell输出的变更文件列表是换行分隔,直接传递给bash会导致多文件被识别为单个参数,parallel无法处理多个文件。
具体修复步骤
1. 修正Docker运行命令(覆盖ENTRYPOINT)
修改convert.yaml中Run Pandoc in Docker步骤的命令,指定bash为镜像入口点,确保脚本被正确执行:
- name: Run Pandoc in Docker run: >- docker run --rm -v ${{ github.workspace }}:/workspace -w /workspace --entrypoint bash pandoc/latex:3.5 ./pandoc.sh ${{ env.list_changed_files }}
2. 修复pandoc.sh脚本语法与逻辑
替换原脚本内容,修正parallel命令格式、变量引用及多文件处理逻辑:
#!/bin/bash # 仅启用--standalone的输出格式列表,可按需扩展 Only_Standalone_Output_Types="latex pdf html docx odt" # 接收所有传入的文件参数 files=("$@") # 用GNU Parallel并行处理每个文件 parallel --jobs 0 ' # 生成AST抽象语法树(复用以提升效率) pandoc --from markdown --to native "./{}" -o "./{.}.ast" # 循环生成各类格式文件 for ext in '"${Only_Standalone_Output_Types}"'; do pandoc --from native "./{.}.ast" --standalone -o "./{.}.$ext" done # 删除临时AST文件 rm "./{.}.ast" ' ::: "${files[@]}"
关键修改点:
- 用
"$@"接收多文件参数,支持含空格的文件名 - 调整parallel命令结构,确保循环逻辑在并行任务中正确执行
- 修正输出文件名:
{.}表示去掉原文件扩展名的名称,避免生成如file.md.pdf的错误路径
3. 修正文件列表输出格式(PowerShell部分)
修改convert.yaml中condition_check_files步骤的PowerShell脚本,将换行分隔的文件列表转为空格分隔,确保bash能正确识别多参数:
# 原输出部分替换为: $FilesDiffStr = $FilesDiff -join ' ' echo "bool_files_changed=$HasDiff" >> $env:GITHUB_OUTPUT echo "list_changed_files=$FilesDiffStr" >> $env:GITHUB_OUTPUT
验证要点
- 确保Docker命令中
--entrypoint bash已添加,避免pandoc误解析命令参数 - 测试多文件变更场景,确认parallel能同时处理多个Markdown文件
- 检查生成的输出文件路径是否正确(如
content/file.md对应生成content/file.pdf等)
内容的提问来源于stack exchange,提问作者GH-MK
相关产品推荐
相关产品推荐

