在未运行的容器中是否可能获得bash访问权限?

4
我已经成功运行了Flask API容器。但是,在应用程序执行期间,由于某种原因导致它失败并停止了容器。
我检查了容器日志,并发现出现了一些文件丢失的错误。现在,我想通过访问已停止容器的/bin/bash来调试缺少的文件。但是,它会抛出一个错误,说容器没有在运行。
是否有任何解决方案可以访问已停止容器中的bash
4个回答

5

您可以尝试使用docker commit命令。

来自文档

将容器的文件更改或设置提交为新图像可能很有用。这使您可以通过运行交互式shell来调试容器,或将工作数据集导出到另一台服务器。

示例资源:

我们可以使用commit命令将容器转换为Docker镜像。我们只需要知道已停止容器的名称或标识符即可。(您可以使用docker ps -a获取所有已停止容器的列表)。

docker ps -a
CONTAINER ID   IMAGE   COMMAND     CREATED         STATUS                    NAMES
0dfd54557799   ubuntu  "/bin/bash" 25 seconds ago  Exited (1) 4 seconds ago  peaceful_feynman

使用已停止容器的标识符0dfd54557799,我们可以创建一个新的Docker镜像。生成的镜像将具有与之前停止的容器相同的状态。此时,我们使用docker run并覆盖原始入口点以进入容器。
# Commit the stopped image
docker commit 0dfd54557799 debug/ubuntu

# now we have a new image
docker images list
REPOSITORY    TAG     IMAGE ID       CREATED         SIZE  
debug/ubuntu  <none>  cc9db32dcc2d   2 seconds ago   64.3MB


# create a new container from the "broken" image
docker run -it --rm --entrypoint sh debug/ubuntu
# inside of the container we can inspect - for example, the file system
$ ls /app
App.dll
App.pdb
App.deps.json
# CTRL+D to exit the container

# delete the container and the image
docker image rm debug/ubuntu

2
docker commit 看起来很有趣。我会尝试这个解决方法。谢谢! - Venkat Ch
好的,让我知道它的表现如何,因为我自己以前没有亲自使用过。 - Krishna Chaurasia
1
docker commit几乎从来不是最佳实践。如果可能的话,你应该尽量少用它甚至不用。对于这种情况来说,它并不是必需的。 - David Maze
1
谢谢你提醒我关于“commit”的事情。我不明白为什么DavidMaze说这是一个不好的做法。所有其他建议都建议检查日志,或者从原始镜像启动一个新容器并更改入口点/等等,这与检查死亡容器完全不同。如果您重新启动并更改入口点/等等,则可以更改启动时发生的事情,并可能看到不同的内容。如果您需要恢复死亡容器并交互式地查看其中的内容,则commit+runshell正是您所需的。说它不好就像说“git switch -c foobar”不好一样。 - quetzalcoatl

3

不可以。

但是,在运行docker时,检查日志或指定bash为入口点可能会很有用。

检查日志:https://docs.docker.com/config/containers/logging/

docker logs  <CONTAINER_NAME>

Shell入口点: https://docs.docker.com/engine/reference/run/#entrypoint-default-command-to-execute-at-runtime

docker run --name <CONTAINER_NAME> --entrypoint /bin/bash <IMAGE_NAME>

如果您的容器没有 /bin/bash,请尝试使用:

docker run --name <CONTAINER_NAME> --entrypoint /bin/sh <IMAGE_NAME>

为了再次运行docker run命令,我必须先删除现有的容器。 - Venkat Ch
是的,否则会出现一些名称和端口冲突。 - Ivhani Maselesele

0
从docker-run的man页面中:
      --entrypoint=""
      Overwrite the default ENTRYPOINT of the image

所以使用类似这样的东西:

 docker run --entrypoint=/usr/bin/sleep 1000 ......

这将启动容器并等待1000秒,以便您可以连接和调试。


0

你做不到,因为这个容器已经停止运行,虚拟机也已经关闭。你可以使用docker logs命令来查看日志。

docker container ls -aq

docker logs <name_of_your_dead_container>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接