【问题标题】:How stop containers run with `docker-compose run`如何使用 docker-compose run 停止容器运行
【发布时间】:2015-06-29 03:47:33
【问题描述】:

我正在尝试使用docker-compose 来编排多个容器。为了排除故障,我经常通过以下方式从容器中运行 bash:

$ docker-compose run --rm run web bash

我总是尝试通过--rm 开关,以便在我退出 bash 会话时删除这些容器。但有时它们仍然存在,我在 docker-compose ps 的输出中看到它们。

           Name                          Command                State      Ports
----------------------------------------------------------------------------------
project_nginx_1            /usr/sbin/nginx                  Exit 0
project_nginx_run_1        bash                             Up         80/tcp
project_web_1              python manage.py runserver ...   Exit 128
project_web_run_1          bash                             Up         8000/tcp

此时,我正在尝试手动停止并删除这些组件,但我无法做到这一点。我试过了:

$ docker-compose stop project_nginx_run_1
No such service: project_nginx_run_1

我还尝试了rmkill等其他命令。

我应该怎么做才能摆脱这些容器?

编辑:

修复了docker-compose ps的输出。

【问题讨论】:

  • 您是否尝试过通过 ID 停止? docker-compose stop b279062e8daa 41de31a0423c?
  • 是的,我仍然收到 no service 错误,这次是容器 ID
  • 我注意到我的docker-compose ps 输出明显不同 - 仅包含 4 列。你是不是误跑了docker ps
  • 你是对的,我错误地粘贴了docker ps的输出。我现在修好了。我用docker-compose 运行所有命令,所以问题仍然存在..

标签: docker docker-compose


【解决方案1】:

只需使用docker stop 命令停止这些测试容器,而不是使用docker-compose

docker-compose 在启动多个容器时非常出色,但使用 docker-compose 启动容器并不妨碍您使用 docker 命令对单个容器执行任何您需要执行的操作。

docker stop project_nginx_run_1 project_web_run_1 

另外,由于您正在调试容器,我建议使用docker-compose exec <service id> bash 在正在运行的容器中获取外壳。这样做的好处是不启动新容器。

【讨论】:

  • 如果您已经使用 run 调用了一些正在运行的容器,那么在重新启动核心容器之前使用 docker stop $(docker ps -q) 停止所有正在运行的容器可能会很有用。
  • 现在你可以做docker-compose stop project_nginx_run project_web_run然后删除docker-compose rm -f project_nginx_run project_web_run
  • 在包含 docker-compose.yaml 文件的目录中简单地发出 docker-compose stop 也可以。
  • 分离运行时的附加说明:docker-compose run -d 在标准输出上返回容器名称,因此将其捕获到变量中:NAME=$(docker-compose run -d ...)。然后使用docker rm -f $NAME
  • @DanielW 我在所有撰写服务上都有restart=always,我从来不需要将其更新为no 以使docker stop 工作并且我的容器保持停止。 (使用 docker 18.09.3 和 docker-compose 1.23.1)
【解决方案2】:

使用 docker-compose,可以通过两种方式停止服务,但我想添加一些有关这两个选项的详细信息。

总之

docker-compose down

停止并删除容器、网络、图像和卷

docker-compose stop

停止服务


详细说明

如果docker-compose run启动服务project_nginx_run_1project_web_run_1,那么

docker-compose down 日志将是

$ docker-compose down
Stopping project_nginx_run_1 ...
Stopping project_web_run_1 ...

.
. some service logs goes here

Stopping project_web_run_1 ... done
Stopping project_nginx_run_1 ... done
Removing project_web_run_1 ... done
Removing project_nginx_run_1 ... done
Removing network project_default

docker-compose stop 日志将是

$ docker-compose stop
Stopping project_nginx_run_1 ...
Stopping project_web_run_1 ...

.
. some service logs goes here

Stopping project_web_run_1 ... done
Stopping project_nginx_run_1 ... done

【讨论】:

  • 我不知道为什么这被否决了,但也许解决方案太宽泛了——我猜最初的问题是希望停止一项服务。
  • 问题询问如何停止使用 docker-compose run 启动的容器,而不是 docker-compose updownstop 命令不适用于由 run 启动的容器。
【解决方案3】:

docker-composedocker 不同,它使用在yml 文件中定义的容器名称。因此,要停止一个容器,命令将是:

docker-compose stop nginx_run

【讨论】:

  • 恕我直言,这是唯一正确的答案。我发现当使用 docker-compose 在容器上使用 restart: unless-stopped 时,如果使用 docker stop <service name> 则服务将简单地重新启动,但只有在使用 docker-compose stop xxx 时服务才会真正停止
【解决方案4】:
docker-compose down

在启动它的目录中,这是我设法确认它已停止的唯一方法,因为 docker-compose ps 不再产生它!

【讨论】:

  • 这可能会产生意想不到的结果,因为 OP 的目标不是停止所有正在运行的容器,而是停止特定的容器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2017-03-06
  • 1970-01-01
  • 2015-07-24
相关资源
最近更新 更多