为什么docker-compose需要为exec命令编写文件?

时间:2017-11-25 10:58:34

标签: bash docker docker-compose

我有一个bash脚本,它位于docker-compose.yaml所在目录的上方。

在bash脚本里面有命令:

docker-compose exec ${service} /somescript_inside_container.sh

执行这个bash脚本时,我得到了:

ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml

但是当使用docker运行此命令并引用container_name而不是service时,例如

docker exec ${container_name} /somescript_inside_container.sh

它会起作用。

对我而言,这并不是明显的行为,我很好奇为什么docker和docker-compose之间存在这样的差异?

1 个答案:

答案 0 :(得分:1)

由docker compose创建的docker容器名称具有生成的名称,除非您指定container_name属性明确。

因此,如果您没有指定撰写文件,exec命令就不知道它需要执行哪个容器。

此外,exec的语法是:

exec [options] SERVICE COMMAND [ARGS...]

因此,您需要指定服务名称,并且可能有多个撰写文件,每个文件使用相同的服务名称。因此,除非您指定compose文件,否则docker无法选择需要在其中运行命令的容器。

对于docker exec命令,您明确指定容器名称。因此没有歧义。

另一方面,在docker compose中,服务名称通常是配置的有意义部分,并且由于容器名称是自动生成的,因此显式指定容器名称将需要手动查找此生成的名称,除非您指定compose创建容器的文件和docker compose可以推断出容器名称。