【问题标题】:Mysql client called with `docker-compose run` vs. `docker-compose exec`使用 `docker-compose run` 与 `docker-compose exec` 调用的 Mysql 客户端
【发布时间】:2017-09-14 15:46:05
【问题描述】:

为什么用docker-compose run调用时需要指定主机?

例如

docker-compose run db_container mysql -uuser -ppass db_name -h db_container

似乎直接相当于

docker-compose exec db_container mysql -uuser -ppass db_name

当省略第一个示例中的主机名标志时,mysql 失败并出现“无法连接到套接字”错误。

这两个例子有什么区别?

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    docker-compose run 将在同一网络上启动一个名为folder_db_container_run_1 的新容器。这没有运行 mysql,因为您向它传递了一个命令。所以它正在运行该命令。所以你从这个容器连接到原来的 db 容器

    docker-compose run db_container mysql -uuser -ppass db_name -h db_container
    

    当你执行 exec 时,你会进入正在运行的容器中。并且不指定主机意味着本地mysql

    docker-compose exec db_container mysql -uuser -ppass db_name
    

    这就是它起作用的原因。在这种情况下不会启动额外的容器

    【讨论】:

    • 谢谢,这是有道理的。如果您有时间,能否请您指出文档中的相关段落?我刚刚阅读了docker-compose run 的条目,我认为这并没有说清楚。
    • docs.docker.com/compose/reference/runCommands you use with run start in new containers with configuration defined by that of the service, including volumes, links, and other details. However, there are two important differences.