在Azure AKS中通过Kubernetes Job执行Python脚本遇文件找不到错误
问题根源
你遇到的错误核心原因是:官方python:3镜像里根本没有your-script.py文件——Kubernetes不会自动把Azure Cloud Shell本地的脚本复制到容器中,必须手动将脚本传递到容器运行环境里。以下是几种可行的解决办法:
方法1:用ConfigMap挂载脚本(快速测试首选)
通过ConfigMap将本地脚本注入到容器中,无需构建镜像:
- 在Azure Cloud Shell中创建ConfigMap,导入你的脚本内容:
# 确保your-script.py在当前工作目录 kubectl create configmap python-log-script --from-file=./your-script.py
- 修改Job的YAML配置,添加挂载规则:
apiVersion: batch/v1 kind: Job metadata: name: your-job-name spec: template: spec: volumes: - name: script-volume configMap: name: python-log-script containers: - name: your-container-name image: python:3 command: ["python", "/scripts/your-script.py"] volumeMounts: - name: script-volume mountPath: /scripts restartPolicy: Never
- 应用修改后的Job配置:
kubectl apply -f your-job.yaml
方法2:直接在Command中嵌入脚本内容
适合短脚本快速验证,无需额外资源:
将脚本内容转成单行格式(换行替换为\n),通过python -c执行:
apiVersion: batch/v1 kind: Job metadata: name: your-job-name spec: template: spec: containers: - name: your-container-name image: python:3 command: ["python", "-c", "import sys\nimport datetime as dt\ndef print_to_stdout(*a):\n print(*a, file=sys.stdout)\nt = dt.datetime.now()\nwhile True:\n delta = dt.datetime.now()-t\n if delta.seconds >=30:\n print_to_stdout(\"Hello World, half minute has passed\")\n t = dt.datetime.now()"] restartPolicy: Never
方法3:构建自定义Docker镜像(生产环境推荐)
长期使用的Job建议打包专属镜像,避免每次挂载或嵌入脚本:
- 在Azure Cloud Shell中创建
Dockerfile:
FROM python:3 WORKDIR /app COPY your-script.py . CMD ["python", "your-script.py"]
- 构建镜像并推送到Azure容器注册表(ACR,需提前创建并登录ACR):
# 替换myacr为你的ACR名称,标签可自定义 az acr build --registry myacr --image python-log-script:v1 .
- 修改Job YAML使用自定义镜像:
apiVersion: batch/v1 kind: Job metadata: name: your-job-name spec: template: spec: containers: - name: your-container-name image: myacr.azurecr.io/python-log-script:v1 restartPolicy: Never
验证方式
Job启动后,通过以下命令查看容器日志确认脚本运行状态:
# 先获取Pod名称 kubectl get pods # 替换<pod-name>为实际Pod名称 kubectl logs <pod-name>
内容的提问来源于stack exchange,提问作者OuterSpace
相关产品推荐
相关产品推荐

