Docker容器在'docker start'后停止

juzqafwq  于 2023-03-29  发布在  Docker
关注(0)|答案(6)|浏览(238)

我是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

b 05 f9727 f516 f216 cfb 59484“/bin/bash”大约1分钟前已退出(0)大约1分钟前
清醒雪莉
不知道为什么我不能得到一个正在运行的容器,为什么它在docker run命令后一直停止。
1.执行docker logs <container_id>不会显示任何内容-它只是返回,没有任何输出。

vu8f3i0k

vu8f3i0k1#

你的Docker镜像实际上没有做任何事情,容器在完成它的工作时停止。因为这里没有前台进程运行它会启动然后立即停止。为了确认你的容器没有问题,尝试将下面的代码放入docker-compose.yml(与Dockerfile在同一个文件夹中)并运行docker-compose up,现在你会看到你的容器正在运行而没有退出。

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

请看这里的Docker官方教程,它将指导你如何使用Docker。

hi3rlvi2

hi3rlvi22#

尝试docker run -it <image> /bin/bash在容器中运行shell。
这对你来说没什么用,但它会告诉你发生了什么:一旦你退出 shell ,它也会退出容器。
你的容器基本上什么都不做:它有一个Ubuntu映像,但没有ENTRYPOINT或CMD命令来运行“something”容器在运行时是短暂的:它们运行单个命令并在命令完成时退出。

uurv41yg

uurv41yg3#

Docker容器分类如下。
1.基于任务:当容器启动时,它将开始处理,并完成该过程,然后退出。
1.背景容器:它会等待一些请求。
因为你没有提供你的docker文件,所以我假设你只有一个声明。

FROM ubuntu:14.04

你的build语句create image with name pm.
1.现在你运行docker run pm,它将启动container并停止,因为你没有提供任何入口点。
1.现在试试这个这是一个命令提示符或终端。

docker run -it pm /bin/bash

打开另一个终端或命令提示符。

docker ps ( Now you will see there is one container).

1.如果你想看到容器持续运行,那么使用下面的图片。(这只是一个例子)

docker run -d -p 8099:80 nginx

上面一行运行一个包含Nginx镜像的容器,当你打开浏览器http://localhost:8099时,你可以看到响应。

rggaifut

rggaifut4#

Docker容器与它们正在运行的进程密切相关。此进程由Docker文件上的“CMD”部分指定。此进程的PID为“1”。如果您终止它,则您的容器将被终止。如果您没有容器,则您的容器将立即停止。在您的情况下,您必须“覆盖”您的CMD。您可以通过以下简单的操作来完成此操作:“docker run -it ubuntu:18.04 bash”.“-it”是强制性的,因为它允许将stdin附加到您的容器。
玩得开心Docker

db2dz4w8

db2dz4w85#

Dockerfile的每一条指令都是一个容器中的一个层,它执行一些任务。在你的docker文件中,它只是加载ubuntu,当你运行docker时,在几秒钟内完成,并在进程完成后退出。所以如果想让你的容器一直运行,那么你的docker中应该有一个前台进程在运行。为了测试,如果你运行
docker run <imageid> echo hi它将返回输出,这意味着你的容器是好的。

1l5u6lss

1l5u6lss6#

这里有三种方法:

检查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以查看容器的运行情况。

备注

  • 相关答案here也可能有用

相关问题