【Docker/K8s】启动容器镜像,使其空转不退出
场景描述
有些时候,我们仅仅想启动一个Docker容器,而不需要它执行预置的命令。比如一个场景是我想检查集群的网络状况,那我需要启动一个容器,然后进入到容器里执行命令来调试。大部分的镜像都带有默认的启动cmd,导致直接docker run
启动的话,很快就会因为预置命令执行失败导致退出。
解决方案
1. 第一种思路是覆盖启动命令为执行sh命令,并启动tty。
此时容器就会一直等待tty,从而达到不退出的效果。这种方法比较简洁方便,在我实际使用中大多数采纳这种方式。
Docker
# 大多数镜像, 如果没有设置entrypoint就可以使用这种方式启动
# 小小解释一下, d代表backend,后台执行;t代表tty,启用tty
docker run -dt {{镜像}} sh
# 设置了entrypoint的镜像启动姿势,重写entrypoint
docker run -dt --entrypoint sh nginx:1.23.1-alpine
# 然后就可以进入容器执行命令了
docker exec -it xxx bash
K8s
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {}
labels:
k8s.kuboard.cn/name: net-util
name: net-util
spec:
replicas: 1
selector:
matchLabels:
k8s.kuboard.cn/name: net-util
template:
metadata:
labels:
k8s.kuboard.cn/name: net-util
spec:
containers:
# 重写启动命令
- command:
- sh
image: 'nginx:1.23.1-alpine'
imagePullPolicy: Always
name: net-util
# 启用tty
tty: true
2. 第二种思路是覆盖命令为一段死循环脚本
比如以下脚本:
sh -c 'while [ 1 == 1 ]; do echo "循环等待" ; sleep 100 ; done'
Docker
# 待补充, 几乎不用这种方式啊
K8s
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {}
labels:
k8s.kuboard.cn/name: net-util
name: net-util
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
k8s.kuboard.cn/name: net-util
template:
metadata:
labels:
k8s.kuboard.cn/name: net-util
spec:
containers:
# 重写启动命令为死循环
- command:
- sh
- '-c'
- 'while [ 1 == 1 ]; do echo "循环等待" ; sleep 100 ; done'
image: 'nginx:1.23.1-alpine'
name: net-util
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
2022-06-15 批量上传依赖到离线nexus仓库(maven/npm)