【问题标题】:start docker container interactively以交互方式启动 docker 容器
【发布时间】:2020-08-31 00:16:36
【问题描述】:

我有一个非常简单的 dockerfile,只有一行,即“FROM ubuntu”。我通过命令docker build -t ubuntu_ .从这个dockerfile创建了一个图像

我知道我可以从这个镜像创建一个新的 docker 容器并使用命令交互地运行它 docker run -it my_new_container

稍后我可以使用以下命令启动这个新容器 start my_new container

据我了解,我还应该能够通过以下方式以交互方式使用此容器 start -i my_new container

但是,它不起作用。它只是运行并退出。我没有像使用运行时那样进入容器的命令提示符。我做错了什么?

【问题讨论】:

  • 从概念上讲,将 Docker 容器视为某个单个进程及其所有数据和运行时依赖项的包装器可能更容易。您的容器正在运行什么进程
  • 不确定您的意思。容器正在运行 ubuntu...
  • "Ubuntu" 不是应用程序。更典型的设置是让容器运行 Nginx、PostgreSQL 或您编写的 Flask 应用程序;这些不是具有交互式外壳的东西,您不需要“登录”到它们。删除和重新创建容器也很常规:在几乎所有情况下,我都会使用 docker rm; docker run 而不是 docker start

标签: linux docker


【解决方案1】:

如果我理解正确,您希望在终端中查看来自容器的日志,就像您使用 docker run 运行映像时一样。如果是这种情况,请尝试使用

docker start -a my_docker_container

【讨论】:

    【解决方案2】:

    你可以输入一个正在运行的容器:

    docker exec -it <container name> /bin/bash
    

    示例:

    docker exec -it my_new_container /bin/bash
    

    如果容器中没有bash,您可以将bash 替换为sh

    如果您需要显式使用 UID,例如 root = UID 0,您可以指定:

    docker exec -it -u 0 my_new_container /bin/bash
    

    这会将您记录为root

    【讨论】:

    • 感谢您的评论。但是,容器没有运行。如果我执行命令“start my_new container”,容器会立即启动并退出。这与执行“docker run --name mybox1 busybox”然后执行“docker start mybox1”相同。 (在第一种情况下,您可以使其与“docker run -it --name mybox1 busybox”交互地工作,但在第二种情况下,我不知道该怎么做。)
    • 如果你想让容器不退出,你需要确保任何正在运行的主进程都在前台并且永远不会退出..
    • 但有时我需要关闭我的电脑,包括。容器,并希望能够以交互方式再次启动它...
    • 那么我该如何以交互方式启动它呢? “你需要确保正在运行的任何主进程都在前台并且永远不会退出......”谢谢!
    • 您已经知道如何以交互方式启动容器(例如使用 TTY)。了解Docs,以便了解 Docker 的工作原理。你不能与已经退出的东西交互。所以你需要让容器运行indefinitely,然后你可以exec一个命令或shell进入i,或者attach到一个正在运行的容器。但是你需要阅读文档
    【解决方案3】:

    直接回答:

    要为未运行的容器运行交互式 shell,首先要找到该容器所基于的映像。

    然后:

    docker container run -it [yourImage] bash
    

    如果您的最终容器基于 alpine 映像,请将 bash 替换为 sh。

    从技术上讲,这将创建一个新容器,但它可以完成工作。

    编辑[首选方法]:

    更好的方法是让容器做一些不相关的事情。 VSCode 文档中的一个不错的解决方案是将以下命令放入 docker-compose.yml 文件的服务定义中:

    services:
       my-app-service:
          command: ["sleep", "infinity"]
          # other relevant parts of your service def...
    

    这里的想法是你告诉你的容器休眠一段时间(无限的时间)。具有讽刺意味的是,您的容器将不得不保持这种状态,从而迫使容器继续运行。

    这就是我运行容器的方式。向需要这些信息的人致以最良好的祝愿。我们都在学习:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2021-10-07
      • 2016-06-05
      • 1970-01-01
      相关资源
      最近更新 更多