You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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支持添加自定义服务到它的启动流程里,步骤如下:

  1. 在你的项目根目录创建如下目录结构:
./s6-overlay/svc.d/my-daily-script/
├── run
└── finish
  1. 编写run脚本(记得后续要给它加执行权限):
#!/usr/bin/with-contenv sh
# 用exec让脚本替换当前进程,被s6正确管理
exec /home/getDailyPublications.sh
  1. 编写finish脚本(可选,用于脚本结束后的清理工作):
#!/usr/bin/with-contenv sh
# 这里可以写清理逻辑,比如删除临时文件等
exit 0
  1. 修改你的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
  1. 修改heroku.yml,让它启动s6-overlay的默认入口:
build:
  docker:
    web: Dockerfile
run:
  web: /init

这样部署后,s6-overlay会自动启动所有服务,包括你添加的自定义脚本。

方案二:跳过s6-overlay,直接运行脚本(适合不需要calibre原有服务的场景)

如果你不需要镜像里calibre的其他服务,可以直接让你的脚本以PID 1身份启动,修改方式如下:

  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"]
  1. 修改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

火山引擎 最新活动