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

问题背景
环境 : 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)。https://segmentfault.com/a/1190000043471705#ext1
  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),就可以直接启动进入容器。
https://segmentfault.com/a/1190000043471705#ext2

扩展

  1. 如何查看容器的配置目录(通常为/var/lib/docker/containers/{CONTAINER ID})
// 示例容器id: 5ec81637aaaa  
docker inspect 5ce8163767a9 | grep ResolvConfPath
  1. 不在运行状态的容器,如何修改未映射的文件内容
// 示例容器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/
  1. 容器无限重启的根本原因
    容器的启动参数设置了 --restart=always,可通过docker update 修改
    容器常驻进程启动失败,没有运行中的进程即自动关

  1. 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/

总结反思
升级前应确认新版本环境要求是否满足
备份很重要!即便Jenkins有升级回滚功能,只要一次异常就可能造成无法挽回的错误
希望有帮到读者,如有错误的地方、需要补充的、有更好的方案、其他心得也欢迎指正。

参考:
https://segmentfault.com/a/1190000043471705

你可能感兴趣的:(docker,bug,servlet)