使用flyctl部署Fly.io应用失败:Kernel报错Attempted to kill init!
Fly.io部署报错“Kernel: not syncing: Attempted to kill init! exitcode=0x00000100”解决方法
问题根源分析
你的fly.toml配置存在核心矛盾:
[build]指定的镜像flyio/hellofly:latest是Go语言的示例镜像,无Node.js运行环境[processes]里的启动命令node app.js、[deploy]的release_command = "npm run build"都依赖Node.js环境,在Go镜像中无法执行,直接导致初始化进程崩溃,触发内核报错。
修复步骤
1. 替换基础镜像
将fly.toml中[build]的镜像替换为Node.js官方镜像,推荐轻量的生产版本:
[build] image = "node:18-alpine"
如果项目需要特定Node.js版本,替换为对应版本号即可(如node:20-slim)。
2. 用Dockerfile管控构建流程(推荐)
仅替换镜像无法加载你的项目代码和依赖,建议添加Dockerfile完整控制构建逻辑,示例如下:
# 构建阶段 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 生产阶段 FROM node:18-alpine WORKDIR /app COPY --from=builder /app/package*.json ./ COPY --from=builder /app/build ./build COPY --from=builder /app/app.js ./ RUN npm ci --only=production EXPOSE 8080 CMD ["node", "app.js"]
然后修改fly.toml的[build]部分,指定使用Dockerfile构建:
[build] dockerfile = "Dockerfile"
3. 清理冗余配置
使用上述Dockerfile时,构建步骤已在镜像构建阶段完成,无需保留release_command,可删除[deploy]区块:
# 移除该部分 [deploy] release_command = "npm run build"
4. 验证端口一致性
确认[services]里的internal_port = 8080和你的Node应用监听端口完全匹配,启动命令node app.js能正常拉起服务。
重新部署
修改完成后,执行命令重新部署:
flyctl deploy
内容的提问来源于stack exchange,提问作者Julius Goddard
相关产品推荐
相关产品推荐

