总结:记一次docker调试镜像的问题

一、背景

同事让帮忙部署一个应用到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调试镜像的问题_第1张图片

总结:记一次docker调试镜像的问题_第2张图片

二、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执行出问题;

总结:记一次docker调试镜像的问题_第3张图片

我们想让容器不挂,我们就执行/bin/bash,创建个/bin/bash环境,这个环境的容器是不会挂的,我们可以进入这个环境,然后手动执行CMD,此时,手动执行CMD只是在容器中起了个子进程,父进程是/bin/bash,即使子进程挂了,只要父进程/bin/bash不挂就没事。

我们看下效果:发现已经进来了。

 我们执行下CMD指定的命令:/usr/bin/thor -config.file /data/thor/config.yaml   

 发现配置文件没有,我们创建并用案例中的内容

最终成功发现了日志,看到了报错的原因,其实就是修改下配置文件的listen 

总结:记一次docker调试镜像的问题_第4张图片

你可能感兴趣的:(K8S,docker,容器,运维)