如何在AWS EKS运行无Web框架Python镜像并获取程序打印输出
问题背景
- 待运行Python脚本
main.py原始代码如下:
import time import sys def hello(): for i in range(10): print("\n"*4, "Hello from AMAN!", "\n"*4) time.sleep(2) sys.exit(0) if __name__ == "__main__": hello()
- 配套镜像构建Dockerfile内容如下:
FROM python:3.7 RUN mkdir /app WORKDIR /app ADD . /app/ RUN pip install -r requirements.txt CMD ["python", "/app/main.py"]
- 需求说明:不依赖Flask、Node等任何Web框架,在AWS EKS集群的Pod中运行上述应用镜像,将程序运行时输出的
Hello from AMAN!等所有标准输出内容回传到本地控制台、SSH会话,或导出为可查看的文件。
场景限制:未部署Web服务,无法通过浏览器访问暴露端口获取输出。
前置代码修正
- 原始代码存在两处会导致运行异常的问题,构建镜像前需要先修复:
- 原始代码中字符串使用了中文全角引号,需要全部替换为英文半角引号,否则Python会抛出语法错误
sys.exit(0)位置错误,当前写法会在调用hello()函数前直接退出脚本,不会执行打印逻辑,需要将该行移动到hello()调用之后,或直接删除该行。
修正后可正常运行的main.py代码:
import time import sys def hello(): for i in range(10): print("\n"*4, "Hello from AMAN!", "\n"*4) time.sleep(2) if __name__ == "__main__": hello() sys.exit(0)
实现方案
所有方案均基于Kubernetes原生能力实现,不需要额外部署Web服务或第三方组件:
实时输出到本地终端/SSH会话
- 确保本地
kubectl已配置好EKS集群的访问权限 - 将构建好的镜像推送到AWS ECR或其他可被EKS节点访问的镜像仓库,部署应用Pod
- 执行
kubectl get pods查询到运行中应用的Pod名称 - 执行
kubectl logs -f <替换为实际Pod名称>,即可实时跟踪容器内应用的标准输出,所有打印内容会直接显示在当前操作的终端/SSH会话窗口,和本地直接运行脚本的输出效果完全一致。
- 确保本地
导出输出内容为本地文件
不需要登录集群节点操作,直接在本地执行日志命令时重定向输出流即可:kubectl logs -f <替换为实际Pod名称> > ./app_runtime_output.log
命令执行期间,应用产生的所有输出会实时写入本地当前目录下的app_runtime_output.log文件,可随时用任意文本编辑器打开查看。临时运行直接流转输出,运行结束自动清理资源
如果不需要长期留存应用Pod,可以直接通过kubectl run临时启动Pod,不需要提前写Deployment等资源配置:kubectl run hello-aman --image=<替换为你的实际镜像地址> --restart=Never --rm -it
执行该命令后会自动启动Pod,直接挂载到容器的标准输入输出流,脚本运行的所有内容会直接打印在当前终端,脚本运行结束后Pod会自动删除,不需要手动清理资源。
内容的提问来源于stack exchange,提问作者Ayush
相关产品推荐
相关产品推荐

