GitHub Actions使用Docker镜像部署Azkaban失败报错127
GitHub Actions 结合 Docker 部署 Azkaban 报错 exit code 127 解决方案
错误日志
./docker-run.sh: 4: cd: can't cd to target/deployment chmod: cannot access './script.sh': No such file or directory ./docker-run.sh: 6: ./docker-run.sh: ./script.sh: not found Error: Error: The process '/usr/bin/docker' failed with exit code 127
根因排查
这三个报错是连锁反应,核心是第一步切目录直接失败,后面所有基于相对路径的操作全错,最后触发Linux系统里「命令/文件找不到」的标准退出码127,问题基本出在这几个地方:
- 路径基准不匹配
cd: can't cd to target/deployment90%的情况是相对路径基准乱了:docker-run.sh里写的相对路径,基准是容器内的工作目录(也就是Dockerfile里WORKDIR配置的值),既不是GitHub Actions运行器的宿主机项目路径,也不是你本地开发机的项目路径。- 先查有没有把
target/deployment目录真的打进镜像、或者挂载进容器:如果Dockerfile里没写COPY target/deployment <容器内目标路径>,或者构建镜像前没跑项目打包命令(Maven package/Gradle build之类)生成这个目录,容器里根本不可能有这个路径。
- 文件位置/格式错误
- 切目录失败后,执行上下文会停在容器默认工作目录,这个目录下没放
script.sh,自然报找不到。就算你把script.sh打进镜像了,放的路径和脚本里写的预期路径对不上,一样会报错。 - 别漏了行尾格式的坑:如果sh脚本是在Windows下写的,默认行尾是CRLF格式,Linux容器识别不了,哪怕文件真实存在也会抛
not found错误。
- 切目录失败后,执行上下文会停在容器默认工作目录,这个目录下没放
- GitHub Actions 配置漏项
- 如果是用
docker run -v挂载宿主机目录的方式跑容器,别写相对路径,Actions运行器里的项目绝对路径要取${{ github.workspace }}变量,写相对路径挂载根本找不到宿主机上的对应目录。
- 如果是用
修复方案
- 先改
docker-run.sh,加调试配置,固定脚本的路径基准,从根源避免相对路径错乱,参考写法:
#!/bin/bash set -ex # 自动定位脚本自身所在的绝对路径,不管从什么路径触发脚本都不会乱 SCRIPT_PATH=$(cd "$(dirname "$0")"; pwd) # 切目录失败直接退出,别继续跑后面的逻辑 cd "${SCRIPT_PATH}/target/deployment" || exit 1 chmod +x ./script.sh ./script.sh
- 改Dockerfile配置,确保所有文件都复制到容器内的对应路径:
# 按需替换成你自己用的基础镜像 FROM openjdk:8-jre-slim # 固定容器内的工作目录 WORKDIR /opt/deploy # 按路径复制脚本和构建产物,和docker-run.sh里的逻辑一一对应 COPY docker-run.sh . COPY script.sh . COPY target/deployment ./target/deployment # 提前给好执行权限,不用等运行的时候再chmod RUN chmod +x docker-run.sh script.sh ENTRYPOINT ["./docker-run.sh"]
- 调整GitHub Actions工作流配置:
- 确认构建镜像的步骤之前,已经跑完了项目打包命令,生成了完整的
target/deployment目录 - 如果用挂载方式运行容器,挂载路径必须写绝对路径,示例:
- name: Run deploy container run: docker run -v ${{ github.workspace }}/target/deployment:/opt/deploy/target/deployment your-deploy-image:latest - 如果是Windows环境提交的代码,加一步转换脚本行尾的操作:
- name: Fix script line ending run: | apt-get update && apt-get install -y dos2unix dos2unix *.sh
- 确认构建镜像的步骤之前,已经跑完了项目打包命令,生成了完整的
验证方法
先在本地项目根目录跑docker build . -t azkaban-deploy-test && docker run --rm azkaban-deploy-test,本地跑通了再推到Actions上执行,别反复提交CI调试浪费时间。如果还是提示找不到文件,就在docker-run.sh里加一行find / -name "script.sh",打印出文件在容器内的实际绝对路径,对着改路径就行。
内容的提问来源于stack exchange,提问作者Anja
相关产品推荐
相关产品推荐

