Heroku Docker应用执行命令报错:`s6-overlay-suexec: fatal: can only run as pid 1` 求助
解决Heroku Docker应用中
s6-overlay-suexec: fatal: can only run as pid 1错误 你碰到的这个问题其实是linuxserver/calibre镜像内置的s6-overlay进程管理系统导致的——这套工具要求启动的主进程必须是PID 1,但Heroku运行你的脚本时,脚本并不是以PID 1身份启动的,所以s6-overlay的suexec组件直接抛出了致命错误。
下面给你两种解决方案,你可以根据自己的需求选择:
方案一:用s6-overlay的方式运行脚本(推荐,保留镜像原有功能)
s6-overlay支持添加自定义服务到它的启动流程里,步骤如下:
- 在你的项目根目录创建如下目录结构:
./s6-overlay/svc.d/my-daily-script/ ├── run └── finish
- 编写
run脚本(记得后续要给它加执行权限):
#!/usr/bin/with-contenv sh # 用exec让脚本替换当前进程,被s6正确管理 exec /home/getDailyPublications.sh
- 编写
finish脚本(可选,用于脚本结束后的清理工作):
#!/usr/bin/with-contenv sh # 这里可以写清理逻辑,比如删除临时文件等 exit 0
- 修改你的Dockerfile,把这个服务配置复制到镜像的s6服务目录:
FROM linuxserver/calibre RUN apt-get update && apt-get install -y --no-install-recommends -qq\ curl neovim # 复制自定义s6服务配置 COPY ./s6-overlay/svc.d/my-daily-script /etc/s6-overlay/svc.d/my-daily-script # 给脚本添加执行权限 RUN chmod +x /etc/s6-overlay/svc.d/my-daily-script/run /etc/s6-overlay/svc.d/my-daily-script/finish COPY . /home WORKDIR /home ENV KINDLE_HOME_DIR "/home" ENV FTP_USER "$FTP_USER" ENV FTP_PASSWORD "$FTP_PASSWORD" RUN chmod +x /home/getDailyPublications.sh
- 修改heroku.yml,让它启动s6-overlay的默认入口:
build: docker: web: Dockerfile run: web: /init
这样部署后,s6-overlay会自动启动所有服务,包括你添加的自定义脚本。
方案二:跳过s6-overlay,直接运行脚本(适合不需要calibre原有服务的场景)
如果你不需要镜像里calibre的其他服务,可以直接让你的脚本以PID 1身份启动,修改方式如下:
- 在Dockerfile末尾添加CMD指令:
FROM linuxserver/calibre RUN apt-get update && apt-get install -y --no-install-recommends -qq\ curl neovim COPY . /home WORKDIR /home ENV KINDLE_HOME_DIR "/home" ENV FTP_USER "$FTP_USER" ENV FTP_PASSWORD "$FTP_PASSWORD" RUN chmod +x /home/getDailyPublications.sh # 用exec让脚本成为PID 1进程 CMD ["sh", "-c", "exec /home/getDailyPublications.sh"]
- 修改heroku.yml(可以直接省略run部分,或者指定对应的命令):
build: docker: web: Dockerfile run: web: sh -c 'exec /home/getDailyPublications.sh'
这里的exec是关键,它会替换当前的shell进程,让你的脚本成为PID 1,从而避开s6-overlay的检查。
两种方案都能解决你遇到的错误,你可以根据自己是否需要保留calibre原有服务来选择~
内容的提问来源于stack exchange,提问作者GGsalas




