You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]
解答
  1. 容器反复重启的核心原因
    这不是Skaffold的问题,而是Kubernetes的默认行为:Pod的restartPolicy默认是Always,只要容器进程退出(无论正常还是异常),Kubernetes就会自动重启Pod。你的代码执行完console.log就终止了进程,触发了K8s的重启逻辑。

  2. Skaffold的适用场景
    Skaffold并非只能用于带监听器的服务,它的核心是构建、部署和代码热同步,不管是长期运行的服务还是一次性任务都可以用,关键是要配合Kubernetes的配置调整Pod的重启策略。

  3. 解决方法

  • 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:12:20