一、背景
同事让帮忙部署一个应用到QKE,给了我镜像地址与配置文件。
由于要将配置文件映射到容器中,我创建了configmap,然后应用中将configmap中key对应的内容映射到了容器中的配置文件中。
但是我遇到了一个问题:
容器频繁快速重启,且看不到日志。
这就很麻烦了,因为没有日志我就看不到错误的原因,所以,当务之急是想办法获取到日志。
之前,我们容器中打印日志,容器重启后,日志就没了,但是至少容器是启动了一会,可以进去看,但是这次这个应用启动太快,立即就挂了,根本没有给时间进入容器。
自己没有想到什么办法,之前一直在想着把容器的日志给映射到pod上,后来同事zy提供了一种用docker调试的办法:用/bin/bash
/bin/bash是提供一个命令行环境,可以执行命令,好处是容器不会挂。
以下是张羽操作截图:最终是通过docker run -it docker-registry.xxx.virtual/weeb/thor:v0.1 /bin/bash命令解决。
二、docker进入容器
我之前在想,docker调试镜像,既然镜像启动后就挂,调试的时候不也会挂吗?
现在看来还是自己对docker的命令不熟悉。
先看下docker原来。
我们先执行命令:docker run -it docker-registry.xxx.virtual/weeb/thor:v0.1
发现没有配置文件,如下报错。
怎么办?
我们再执行下:docker run -it docker-registry.xxx.virtual/weeb/thor:v0.1 ls /data
和上面命令不同的是,这个命令后面加了:“ls /data”,看下效果:
可见后面的 ls /data被执行了。这就是重点了,如果镜像后面带了命令,docker就不会再执行镜像里面定义的CMD,
如下就是镜像里面定义的CMD,意思是容器起来后第一步就执行CMD,即启动服务,并且指定/data/thor/config.yaml这个配置文件启动。
而这个服务+配置文件有问题,所以就启动失败,容器就挂了。
所以总结下来,容器结束有两种方式:
1、命令执行结束;
- 上面执行ls /data由于是执行完了,结束容器。
2、CMD执行出问题;
我们想让容器不挂,我们就执行/bin/bash,创建个/bin/bash环境,这个环境的容器是不会挂的,我们可以进入这个环境,然后手动执行CMD,此时,手动执行CMD只是在容器中起了个子进程,父进程是/bin/bash,即使子进程挂了,只要父进程/bin/bash不挂就没事。
我们看下效果:发现已经进来了。
我们执行下CMD指定的命令:/usr/bin/thor -config.file /data/thor/config.yaml
发现配置文件没有,我们创建并用案例中的内容
最终成功发现了日志,看到了报错的原因,其实就是修改下配置文件的listen