关于docker:docker容器无限重启不新建容器进入原容器修复bug

135次阅读

共计 1517 个字符,预计需要花费 4 分钟才能阅读完成。

问题背景

环境 : Centos7 下 docker 部署 Jenkins 2.235.5

故障:Jekins 依据页面提醒间接版本升级 2.392,重启之后,Jenkins 页面无法访问,容器有限重启,无奈进入容器。

起因:查看 docker 日志 提醒如下

Running with Java 8 from /java/jdk, which is older than the minimum required version (Java 11). 

即原容器装置的是 java 8,Jenkins 新版本最低需要是 java 11。

问题找到了,只有咱们能进入容器里,去降级下 jdk,或者回退 Jenkins 版本,对于运维人员来说问题就好解决了,这里就略过后续。

当初问题来了,咱们怎么不新建容器,间接进入原容器去修复 bug?

解决流程

  1. 找到容器的配置目录里的 config.v2.json(参考扩大 1)。
  2. 要批改的中央有三个字段,别离是 Path、Args,和 Entrypoint(也可能是 CMD)。这里咱们心愿容器能启动进入即可,所以启动命令能够为 ”sleep 3600″ (休眠 1 小时)。

    "Path": "sleep",     // 可执行文件
    "Args": ["3600"],    // 参数
    "Entrypoint": [      // 残缺命令
     "sleep",
     "600"
    ],

    留神:批改前留神先备份,前面修复后笼罩回来。

  3. 重启 docker,使配置失效,即可运行容器。
  4. 进入零碎修复 bug 后,改回配置,同样重启 docker 配置失效。

留神:如果是有其余容器在运行中,不能重启 docker 的状况下,咱们能够依据理论状况变通去解决:

本例中我遇到的 Entrypoint 启动配置如下:

"Entrypoint": [
    "/sbin/tini",
    "--",
    "/usr/local/bin/jenkins.sh"
],

即通过运行 xx.sh 脚本来启动服务。这样咱们能够通过在 xx.sh 脚本前退出“sleep 3600”(参考扩大 2),就能够间接启动进入容器。

扩大

  1. 如何查看容器的配置目录(通常为 /var/lib/docker/containers/{CONTAINER ID})

    // 示例容器 id: 5ec81637aaaa  
    docker inspect 5ce8163767a9 | grep ResolvConfPath

  2. 不在运行状态的容器,如何批改未映射的文件内容

    // 示例容器 id: 5ec81637aaaa 示例文件 /usr/local/bin/jenkins.sh
    docker cotainer cp 5ec81637aaaa:/usr/local/bin/jenkins.sh .
    cp jenkins.sh jenkins.sh.backup
    sed -i "2i sleep 600" jenkins.sh
    docker cp jenkins.sh 5ec81637aaaa:/usr/local/bin/
  3. 容器有限重启的根本原因

    • 容器的启动参数设置了 –restart=always,可通过 docker update 批改
    • 容器常驻过程启动失败,没有运行中的过程即主动敞开
  4. mac 中的容器配置,cd 门路不存在

    # Mac 中进入 Docker Linux 虚拟机 (Docker Desktop 2.4 及以上)
    stty -echo -icanon && nc -U ~/Library/Containers/com.docker.docker/Data/debug-shell.sock && stty sane # ls -al /var/lib/docker/overlay2/

总结反思

  1. 降级前应确认新版本环境要求是否满足
  2. 备份很重要!即使 Jenkins 有降级回滚性能,只有一次异样就可能造成无法挽回的谬误

心愿有帮到读者,如有谬误的中央、须要补充的、有更好的计划、其余心得也欢送斧正。

正文完
 0