【问题标题】:Docker Container is not runningDocker 容器未运行
【发布时间】:2018-11-17 07:51:37
【问题描述】:

请帮忙。当我想进入容器时说

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

我的 Docker 文件:

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

请你告诉我我做错了什么? P.S 在运行时添加 -d 标志没有帮助。

【问题讨论】:

  • 你的入口点只是打印出一个语句然后就存在了。也许您可以通过使用 /bin/bash 作为入口点来启动 bash 自身?
  • 谢谢。但我不明白你的意思。

标签: docker deployment


【解决方案1】:

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

一旦容器退出,你就不能docker exec进入它。

如果你想在刚刚构建的图像上获得一个 shell 以在其中四处寻找,你可以

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

为了让这更容易运行,您可以在 Dockerfile 中将 ENTRYPOINT 更改为 CMD。 (Docker 将运行 ENTRYPOINT 并将 CMD 作为命令行参数传递;或者如果没有入口点,则运行 CMD。)

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

完成后,您可以更轻松地覆盖命令

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

【讨论】:

  • 但是我的 CMD 部分会是什么样子?
  • 我需要通过 exec -it 进入一个 docker 容器,别无他法。
  • 你为什么运行 --rm 它会删除容器
  • 是的,没错;我宁愿不要将几十个完成的临时容器泄漏到docker ps 输出中。
  • 那么使用--rm意味着容器最终被杀死了?
【解决方案2】:

你可以试试 docker start container_id 然后 docker exec -ti container_id bash 用于停止的容器。

【讨论】:

    【解决方案3】:

    您无法执行容器,因为您的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 命令也会重现错误:(
    • 您的入口脚本已执行,但会停止容器,因为它完全停止了。您确实需要启动一个永远运行的进程。如stackoverflow.com/questions/43419500/… 中所述
    • 要永远运行我只需要在运行容器时添加 -d 标志。但这无济于事。
    • @AntonyLapitskiy 带有 -d 标志,它作为守护进程运行(在后台),但是当脚本结束时它仍然停止,这是他的主要问题,正如我在答案中的第一个句子中提到的那样。如果您需要ENTRYPOINT 脚​​本,那么您需要这样一个不存在的脚本。例如 phyton http 服务器。
    • 如果你知道怎么做,你能给我写一些工作案例吗?有一瞬间,当我从 docker 文件中删除 ENTRYPOINT 时,我可以毫无问题地进入容器。
    【解决方案4】:

    我尝试了这两个命令并且它有效:

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

    【讨论】:

      猜你喜欢
      • 2015-06-18
      • 2021-12-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2020-02-23
      • 2017-09-27
      • 1970-01-01
      • 2022-10-04
      相关资源
      最近更新 更多