我应该使用 docker-compose up 命令还是 run 命令?

是否有使用 run启动 docker-compose.yml文件的原因,还是应该只使用 up

我理解 run可以启动一个特定的容器,但我指的是这样一种情况,即您使用它时没有指定一个容器,因此它可以启动所有的 yml 容器。

117032 次浏览

docker-compose run(2015)所述

Run 传递的命令重写在服务配置 中定义的命令。
例如,如果 Web 服务配置是用 bash启动的,那么 docker-compose run web python app.pypython app.py覆盖它。

第二个区别是 docker-compose run命令 不创建服务配置中指定的任何端口
这可以防止与已经打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定—— service-ports 标志:

$ docker-compose run --service-ports web python manage.py shell

因此,除非您具有这些特定的需求(重写命令或在不同的端口上仅运行一个容器) ,否则 docker-compose up(即使对于一个容器)就足够了。

正如 问题42评论中指出的,你这样做是为了测试:

不要忘记在 run之后添加 --rm,否则每次运行 docker-compose run ...时都会创建容器,这些容器在退出后不会被删除。
当您没有意识到这一点并且在一段时间内进行测试时,这可能会导致出现一个长长的容器列表。


您可以帮助解释为什么或何时不希望创建端口吗?这就是为什么或何时它们可能与已经开放的港口发生冲突

仅仅因为 docker-compose run是用来为您的服务运行一次性命令的。
这意味着,如果您已经执行了 docker-compose up,则所有容器都已经从 docker-compose.yml在指定的端口上运行。
在这个阶段执行 docker-compose run(执行一次性命令) ,如果执行的是相同的端口,将立即失败。因此默认不创建这些端口。


另一个用例(在 编写环境变量引用中) :

要查看服务可以使用哪些环境变量,请运行 docker-compose run SERVICE env


这些命令的最新版本(2019年以上)在 docker/docker.github.io上:

我想指出的是,如果您在 pdb 调试器中使用 Python:

import pdb; pdb.set_trace()

如果使用以下方法执行脚本,它将不会掉到 shell 中:

docker-compose up

但是,如果使用 run,它将按预期下拉到调试器:

docker-compose run

码头文件给出了答案。

通常,您需要 docker-compose up。请使用 up启动或重新启动所有 在 docker-compose.yml中定义的服务 “连接”模式下,可以看到来自所有容器的所有日志 “分离”模式(-d) ,启动容器后 Compose 退出,但 容器继续在后台运行。

docker-compose run命令用于运行“ one-off”或“ adhoc” 它需要您想要运行的服务名称,并且只启动 运行服务所依赖的服务的容器。使用 run 运行测试或执行管理任务,如删除或 将数据添加到数据卷容器 docker run -ti,因为它打开一个交互式终端到 容器的退出状态,并返回与 在容器中进行处理。