docker(常见调试技巧):docker打包镜像调试技巧 https://www.cnblogs.com/haoprogrammer/p/11103301.html
写Dockerfile可以先不指定CMD、ENTRYPOINT等启动命令,只要拷贝就好了
Dockerfile
#CMD ["/usr/mpsp/app/script/serv.sh","console"]
先注释掉CMD启动命令,打包镜像app,然后用sh命令启动并进入容器,
docker run -ti basic-app-client:1.2.2.2-jdk7 sh
# 进入容器后,再执行启动脚本,调试。
进入容器后,再启动应用的启动脚本,调试即可。
非常适用于docker log日志查看报错信息 不明确的情况
摘录:总结:记一次docker调试镜像的问题
https://blog.csdn.net/w2009211777/article/details/131124239
命令:
docker run -it docker-registry.xxx.virtual/weeb/thor:v0.1 /bin/bash
/bin/bash是提供一个命令行环境,可以执行命令,好处是容器不会挂。
docker run -it docker-registry.xxx.virtual/weeb/thor:v0.1 ls /data
先看下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不挂就没事。
我们看下效果:发现已经进来了。
原文链接:https://blog.csdn.net/w2009211777/article/details/131124239