Docker容器在执行'docker start'命令后一直停止。

4

我对Docker还比较新手。我继承了一个由之前的开发者编写的很长的Dockerfile,里面有很多错误,我正在努力将其恢复到工作状态。我将文件中大部分内容注释掉,只保留了第一行:

FROM ubuntu:14.04

我做了以下事情:
  1. 使用docker build -t pm .命令构建镜像,这个步骤成功了,因为当我执行docker images命令时,我可以看到这个镜像。
  2. 运行docker run <image-id>命令,没有任何错误或提示信息。现在我期望容器从镜像中创建并启动。但是当我执行docker ps -a命令时,它显示容器已经退出:
CONTAINER ID        IMAGE               COMMAND             CREATED    STATUS                          PORTS               NAMES 

b05f9727f516 f216cfb59484 "/bin/bash" About a minute ago Exited (0) About a minute ago
lucid_shirley

我不确定为什么无法获取正在运行的容器,以及为什么在执行docker run命令后它会一直停止。

  1. 执行docker logs <container_id>没有显示任何内容 - 它只是返回而没有任何输出。

你可以通过 docker logs your-container-id-or-name 查看容器日志,并从那里开始调试。 - sipp11
我已经尝试了,但没有显示任何内容。我会把这个问题加到我的提问中。 - gomisha
你正在运行的机器是否有足够的内存来运行Ubuntu?你是否正在运行多个容器?你可以通过docker ps -a命令来检查正在运行的容器。 - Yogesh D
我想支持@Ntwobike的回答,如果你的容器实际上无事可做,你可以添加CMD watch -n1 ls保持其运行。 - Oscar Nevarez
6个回答

5

您的Docker镜像实际上没有任何作用,容器在完成工作后停止。由于此处没有运行前台进程,因此它将启动,然后立即停止。 为了确认您的容器没有问题,请尝试将以下代码放入docker-compose.yml(与Dockerfile在同一文件夹中),并运行docker-compose up,现在您将看到您的容器正在运行且不会退出。

version: '3'
services:
  my-service:
    build: .
    tty: true    

请查看Docker官方教程,它将指导您如何使用Docker。

5

可以尝试使用以下命令 docker run -it <image> /bin/bash 在容器内部运行一个shell。

这可能对你来说没有太大用处,但它可以让你看到正在发生的事情:一旦退出shell,容器也会退出。

你的容器基本上没有做任何事情:它有Ubuntu的映像,但没有ENTRYPOINT或CMD命令来运行“something”。 当容器运行时,它们是短暂的:它们运行单个命令,并在命令完成后退出。


3

Docker容器按如下方式分类。

  1. 基于任务:当容器启动时,它会开始处理,并在完成处理后退出。

  2. 后台容器:它将等待某些请求。

由于您没有提供Docker文件,因此我假设您只有一个语句。

FROM ubuntu:14.04

您的构建语句将创建一个名为pm的镜像。

  1. Now you run docker run pm It will start container and stop as you did not provide any entry point.

  2. Now try this This is one command prompt or terminal.

    docker run -it pm /bin/bash
    

    Open another terminal or command prompt.

    docker ps ( Now you will see there is one container).
    
  3. If you want to see container that is continuously running then use following image. (This is just a example)

    docker run -d -p 8099:80 nginx 
    

在上述命令中,我们运行了一个Nginx镜像的容器。当您在浏览器中打开http://localhost:8099时,您可以看到响应结果。


2
Docker容器与其运行的进程密切相关。这个进程由Dockerfile上的"CMD"部分指定,并且该进程具有PID "1"。如果您杀掉它,您的容器也会被杀死。如果您没有一个进程,您的容器将立即停止。在您的情况下,您需要"覆盖"您的CMD。您可以通过简单的命令实现:"docker run -it ubuntu:18.04 bash"。 "-it"是必需的,因为它允许stdin连接到您的容器。
祝玩得愉快!

2
每个Dockerfile指令都是容器中的一个层,用于执行某些任务。在你的Docker文件中,它只是加载Ubuntu,当你运行docker时,它会在几秒钟内完成并退出,因为进程已经结束。因此,如果想让你的容器一直运行,则应该在docker中运行前台进程。
为了测试,如果你运行docker run <imageid> echo hi,它将返回输出,这意味着你的容器正常。

0

以下是三种方法:

检查 CMD 是否为长时间运行的进程

确保您的 CMDENTRYPOINT 是长时间运行或阻塞进程(例如启动应用程序服务器),否则它将仅运行一次,然后容器将停止。

使用 -t 选项

尝试使用 -t 选项。例如:

docker run -dt -p 8888:8888 my-image

将长时间运行的命令添加到CMD指令中

您可以随时将长时间运行或阻塞进程放置在CMD指令中。例如,如果这是您的CMD指令:

CMD["sh", "-c", "/runme.sh"]

然后你可以像这样添加 && tail -f /dev/null

CMD["sh", "-c", "/runme.sh && tail -f /dev/null"]

这只是给CMD一个长时间运行的过程,从而保持您的容器运行。 打开另一个终端窗口并运行docker ps以查看正在运行的容器。

注意


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