问题背景
环境 : 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?
解决流程
- 到容器的配置目录里的 config.v2.json (参考扩展1)。https://segmentfault.com/a/1190000043471705#ext1
- 要修改的地方有三个字段,分别是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
扩展
- 如何查看容器的配置目录(通常为/var/lib/docker/containers/{CONTAINER ID})
// 示例容器id: 5ec81637aaaa
docker inspect 5ce8163767a9 | grep ResolvConfPath
- 不在运行状态的容器,如何修改未映射的文件内容
// 示例容器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/
- 容器无限重启的根本原因
容器的启动参数设置了 --restart=always,可通过docker update 修改
容器常驻进程启动失败,没有运行中的进程即自动关
闭
- 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