3

如何不启动容器,直接进入Docker镜像里执行命令?

 1 year ago
source link: https://www.skypyb.com/2022/06/jishu/1988/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何不启动容器,直接进入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镜像调试这一块基本就不存在什么问题了。

剩下的全看你的基础运维能力。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK