【问题标题】:Is it possible to get bash access in NOT running container?是否可以在未运行的容器中获得 bash 访问权限?
【发布时间】:2021-02-11 14:59:14
【问题描述】:

我能够成功运行 Flask API 容器。但在应用执行期间,它会因某种原因失败并停止容器。

我确实检查了容器日志并注意到一些文件丢失错误即将到来。现在我想通过访问已停止容器的/bin/bash 来调试丢失的文件。但是它会抛出一个错误,说容器没有运行。

docker exec -it CONTAINER /bin/bash

是否有任何解决方法可以访问 STOPPED 容器中的 bash

【问题讨论】:

    标签: bash docker containers


    【解决方案1】:

    不,你不能。

    但是,在执行 docker run 时检查日志或指定 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 命令,我必须先删除现有的容器。
    • 可以,否则会出现一些名称和端口冲突
    【解决方案2】:

    你不能因为这个容器已经死了,而且被拒绝的虚拟机也死了。您可以使用docker logs 命令查看日志。

    docker container ls -aq
    
    docker logs <name_of_your_dead_container>
    

    【讨论】:

      【解决方案3】:

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

      来自docs

      将容器的文件更改或设置提交到 一个新的形象。这允许您通过运行 交互式 shell,或将工作数据集导出到另一台服务器。

      Resource with a example:

      我们可以使用提交将容器转换为 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
      

      【讨论】:

      • docker commit 似乎很有趣。我会尝试这个解决方法。谢谢!
      • 酷,让我知道它是如何使用的,因为我以前没有亲自使用过它。
      • docker commit 几乎从来都不是最佳实践。如果有的话,你应该谨慎使用它。在这种情况下应该没有必要。
      【解决方案4】:

      来自 docker-run 的手册页:

            --entrypoint=""
            Overwrite the default ENTRYPOINT of the image
      

      所以使用类似的东西:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2020-07-30
        相关资源
        最近更新 更多