有理由使用run来启动docker-compose.yml文件还是应该只使用up?
run
docker-compose.yml
up
我知道run可以启动一个特定的容器,但我指的是你使用它而不指定一个容器的情况,以便它启动你所有的 yml 容器。
如docker-compose run(2015)中所述
docker-compose run
run 传递的命令会覆盖服务配置中定义的命令 。 例如,如果 Web 服务配置以 开头bash,则docker-compose run web python app.py使用 覆盖它python app.py。 第二个区别是该docker-compose run命令 不会创建服务配置中指定的任何端口 。 这可以防止端口与已经打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定 –service-ports 标志:
run 传递的命令会覆盖服务配置中定义的命令 。 例如,如果 Web 服务配置以 开头bash,则docker-compose run web python app.py使用 覆盖它python app.py。
bash
docker-compose run web python app.py
python app.py
第二个区别是该docker-compose run命令 不会创建服务配置中指定的任何端口 。 这可以防止端口与已经打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定 –service-ports 标志:
$ docker-compose run --service-ports web python manage.py shell
因此,除非您有这些特定需求(覆盖命令或仅在不同端口上运行一个容器),docker-compose up(即使对于一个容器)就足够了。
docker-compose up
如questionto42的评论中所述,您这样做是为了测试:
不要忘记在--rm之后添加run,否则每次运行时都会创建容器docker-compose run ...,退出后不会被删除。 当您不知道这一点并测试一段时间时,这可能会导致一长串容器。
--rm
docker-compose run ...
您能否帮助解释为什么或何时不希望创建端口?这就是它们可能与已经打开的端口发生冲突的原因或时间
仅仅因为docker-compose run它为您的服务运行一次性命令。 这意味着,如果您已经执行了 ,那么您的docker-compose up所有容器都已经在它们指定的端口上从docker-compose.yml. 在这个阶段执行a docker-compose run(执行一次性命令),如果它尊重同一个端口,将立即失败。因此默认不创建这些端口。
另一个用例(在Compose 环境变量参考中):
要查看服务可以使用哪些环境变量,请运行docker-compose run SERVICE env.
docker-compose run SERVICE env
这些命令的最新(2019+)版本在docker/docker.github.io:
docker/docker.github.io
docker compose run
docker compose up