【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

posted @ 2023-06-15 15:32  小小记录本  阅读(996)  评论(0编辑  收藏  举报