Skaffold无监听容器反复重启问题咨询
问题
运行skaffold dev时,带有Express监听器的容器可以正常驻留;移除监听器改为简单执行console.log('test')后,容器会反复重启。查文档得知Skaffold仅应在代码变更时重跑代码,预期容器执行完成后终止,想咨询:
- 这种反复重启是否为正常行为?
- 是否仅需为带监听器的服务配置Skaffold?
相关配置代码如下:
skaffold.yaml
apiVersion: skaffold/v2alpha3 kind: Config deploy: kubectl: manifests: - ./dpl/* build: local: push: false artifacts: - image: myuser/myworker context: myworker docker: dockerfile: Dockerfile sync: manual: - src: 'src/**/*.ts' dest: .
index.ts
//import express from 'express' //const app = express() console.log('test') //app.listen(3000, () => { // console.log('Listening on port 3000!') //})
package.json
{ "name": "myworker", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "ts-node-dev --poll src/index.ts" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@types/express": "^4.17.21", "express": "^4.19.2", "ts-node-dev": "^2.0.0", "typescript": "^5.4.5" } }
Dockerfile
FROM node:alpine WORKDIR /app COPY package.json . RUN npm install --omit=dev COPY . . CMD ["npm", "start"]
解答
容器反复重启的核心原因
这不是Skaffold的问题,而是Kubernetes的默认行为:Pod的restartPolicy默认是Always,只要容器进程退出(无论正常还是异常),Kubernetes就会自动重启Pod。你的代码执行完console.log就终止了进程,触发了K8s的重启逻辑。Skaffold的适用场景
Skaffold并非只能用于带监听器的服务,它的核心是构建、部署和代码热同步,不管是长期运行的服务还是一次性任务都可以用,关键是要配合Kubernetes的配置调整Pod的重启策略。解决方法
- 调整Kubernetes重启策略:在你的Deployment/Pod manifest文件中,添加
restartPolicy字段:- 用
restartPolicy: Never:Pod一旦执行完成终止,无论退出码是什么,都不会重启; - 用
restartPolicy: OnFailure:仅当容器异常退出(退出码非0)时才重启。
- 用
- 修改启动脚本:当前用的
ts-node-dev --poll是用来监听文件变化自动重启进程的工具,对于一次性任务来说没必要。可以把package.json里的start脚本改成ts-node src/index.ts,避免工具本身因进程终止而反复重启。
内容的提问来源于stack exchange,提问作者gil
相关产品推荐
相关产品推荐

