Docker容器未运行。

5

请帮忙。当我想进入一个容器时,会显示以下信息:

来自守护程序的错误响应:容器90599013c666d332ff6560ccde5053d9127e72042ecc3887550aef90fa1d1eac未运行

我的DockerFile:

FROM ubuntu:16.04

MAINTAINER Anton Lapitski <a.lapitski@godeltech.com>

RUN mkdir -p /usr/src/app

WORKDIR /usr/src/app


ADD ./ /usr/src/app

EXPOSE 80

ENTRYPOINT ["/bin/sh", "-c", "/usr/src/app/entry.sh"]

启动脚本 - start.sh:

sudo docker build -t starter .
sudo docker run -t -v mounted-directory:/usr/src/app/mounted-directory -p 80:80 starter

entry.sh脚本:

echo "Hello World"
ls -l
pwd
if mountpoint -q /mounted-directory 
then
  echo "mounted"
else
  echo "not mounted"
fi

sudo docker ps -a的输出如下:

CONTAINER ID   IMAGE  COMMAND CREATED STATUS   PORTS   NAMES
90599013c666   starter "/bin/sh -c /usr/src…"   18 minutes ago      Exited (0) 18 minutes ago                       thirsty_wiles

最重要的是:

sudo docker exec -it 90599013c666 bash
Error response from daemon: Container 90599013c666d332ff6560ccde5053d9127e72042ecc3887550aef90fa1d1eac is not running

请问我做错了什么?顺便说一下,加上-d标志并没有帮助到我。

1
你的Entrypoint只是打印一条语句,然后退出。也许你可以使用/bin/bash作为Entrypoint启动bash本身? - triplem
谢谢。但我不明白你的意思是什么。 - Antony Lapitskiy
4个回答

8

一旦ENTRYPOINT完成(以任何形式),容器就会退出。

一旦容器退出,您无法通过docker exec进入它。

如果您想在刚构建的镜像中获取一个shell以便进行探索,可以执行以下操作:

sudo docker run --rm -it --entrypoint /bin/sh starter

为了更方便地运行,您可以在Dockerfile中将ENTRYPOINT更改为CMD。(Docker将运行ENTRYPOINT并将CMD作为命令行参数传递;或者如果没有entrypoint,则只运行CMD。)

...
RUN chmod +x ./app.sh
CMD ["./app.sh"]

完成这一步后,您可以更轻松地覆盖该命令

sudo docker run --rm -it starter /bin/sh

但是我的CMD部分会是什么样子呢? - Antony Lapitskiy
我需要通过 exec -it 命令进入一个 Docker 容器,没有其他方式。 - Antony Lapitskiy
为什么要运行 --rm,它会删除容器。 - Antony Lapitskiy
没错,我更喜欢不将数十个已完成的临时容器泄露到“docker ps”输出中。 - David Maze
那么使用 --rm 的意思是容器最终会被杀死? - Antony Lapitskiy

2
您可以尝试使用docker start container_id,然后使用docker exec -ti container_id bash来启动已停止的容器。

0

我尝试了这两个命令,它们可以正常工作:

sudo docker start <container_id>
docker exec -it <containerName> /bin/bash

0

您无法执行容器,因为您的ENTRYPOINT脚本已经完成,容器已停止。请尝试以下操作:

  1. 从Dockerfile中删除ENTRYPOINT
  2. 重新构建镜像
  3. 使用sudo docker run -it -v mounted-directory:/usr/src/app/mounted-directory -p 80:80 starter sh运行它

关键是命令中的i标志和末尾的sh


我需要ENTRYPOINT,因为它运行entry.sh脚本。即使我按照您的建议尝试再次在容器上运行exec -it命令,也会重现错误:( - Antony Lapitskiy
您的入口脚本已执行,但会停止容器,因为它会干净地停止。您需要启动一个永久运行的进程,就像 https://dev59.com/-lcQ5IYBdhLWcg3wCvY4 中所描述的那样。 - triplem
要永久运行,我只需要在运行容器时添加-d标志。但这并没有帮助。 - Antony Lapitskiy
使用-d标志,@AntonyLapitskiy可以在后台作为守护进程运行,但当脚本结束时仍会停止,这是他在答案的第一句话中提到的主要问题。如果您需要“ENTRYPOINT”脚本,则需要一个不存在的脚本。例如,一个Python HTTP服务器。 - lependu
如果您知道如何操作,能否给我写一些可行的案例呢?另外,有一个问题是当我从docker文件中删除ENTRYPOINT时,我可以轻松地进入容器。 - Antony Lapitskiy
很抱歉,这是一个全新的问题和提问。请参考如何撰写好问题 - lependu

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