我有一个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之间存在这样的差异?
答案 0 :(得分:1)
由docker compose创建的docker容器名称具有生成的名称,除非您指定container_name
属性明确。
因此,如果您没有指定撰写文件,exec命令就不知道它需要执行哪个容器。
此外,exec的语法是:
exec [options] SERVICE COMMAND [ARGS...]
因此,您需要指定服务名称,并且可能有多个撰写文件,每个文件使用相同的服务名称。因此,除非您指定compose文件,否则docker无法选择需要在其中运行命令的容器。
对于docker exec命令,您明确指定容器名称。因此没有歧义。
另一方面,在docker compose中,服务名称通常是配置的有意义部分,并且由于容器名称是自动生成的,因此显式指定容器名称将需要手动查找此生成的名称,除非您指定compose创建容器的文件和docker compose可以推断出容器名称。