【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