如何不启动容器,直接进入Docker镜像里执行命令?
当你自己打的Docker镜像 run 失败了的时候,想要调试还是有特殊方法的。
最低级的方法就是去重新写Dockerfile,然后重新build、执行看日志,效率损失过于高昂。
简单来说,我们可以在不启动容器的情况下,直接进入Docker镜像里执行命令, 这样子对我们调试而言就很舒服了。
实现的方式就是在启动容器时 手动设置 entrypoint 入口点,覆盖掉镜像中的CMD命令,使用自己自定义的方式启动。
比如可以设置为一般镜像都有的 /bin/bash。
当然,如果你是 Alpine Linux 这种连Bash都没有的极简镜像,那可以在Dockerfile里写上 `RUN apk add –no-cache bash` 来手动安装。
但如果你不需要执行bash脚本,只需要看看文件正不正确啊,某个命令能不能执行啊。 可以直接使用 /bin/sh 来作为Docker的 entrypoint 。
执行以下命令( 以 /bin/bash 作为示例)
docker run --rm -it --entrypoint=/bin/bash image-name
image-name 就是你的镜像名称
执行完毕后就是直接进入容器。
之后想 ls, 还是 vi 、 top 、 cat 都随便你自己了,因为默认的容器启动命令没有执行,现在就是相当于你直接进入了一个拥有你镜像环境的 Linux 主机而已。
如果你执行命令的镜像里边不存在 /bin/bash , 那么他会报错:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused “exec: \”/bin/bash\”: stat /bin/bash: no such file or directory”: unknown.
ERRO[0000] error waiting for container: context canceled
有的人压根不知道自己手里的镜像是个啥情况。可能是公司里其他人给自己的而不是自己打包的。
想知道这个Docker镜像启动的CMD命令是什么、环境变量是什么,entrypoint是什么, 镜像里的文件保存在哪儿。
那么还可以借助下面的命令来查看:
docker inspect image-name
以上,都能直接进Linux环境看了,在Docker镜像调试这一块基本就不存在什么问题了。
剩下的全看你的基础运维能力。