如何从容器内部控制docker compose管理的所有服务容器?
问题根因
Docker Compose 通过**项目名称(project name)**对应的容器标签来识别同属一个配置栈的容器,默认项目名称为执行docker compose up命令时的当前工作目录名称。
你在宿主机启动服务时,采用的是宿主机当前目录的名称作为默认项目名;但在容器内执行查询命令时,配置文件挂载到了/tmp目录下,Compose默认取tmp作为项目名,和宿主机启动时的项目名不匹配,因此查询结果为空。
解决方案
方法1:显式指定项目名
首先在宿主机执行以下命令,获取实际使用的项目名:
docker inspect redis-1 | grep com.docker.compose.project
得到项目名(例如为myproject)后,在容器内执行命令时添加-p参数指定该项目名即可:
docker run -it \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /current_directory/:/tmp/ \ docker/compose -f /tmp/docker-compose.yml -p myproject ps
方法2:保持工作目录路径一致
挂载配置目录时保持宿主机和容器内的路径一致,同时指定容器的工作目录为该路径,即可让Compose自动匹配到正确的项目名。假设宿主机的配置目录为/home/user/myproject,执行命令如下:
docker run -it \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/user/myproject:/home/user/myproject \ -w /home/user/myproject \ docker/compose ps
注意事项
- 确保容器内的Docker Compose大版本和宿主机一致,你宿主机使用的是Compose V2,官方
docker/compose镜像默认搭载V1版本,建议使用自行构建的带Compose V2的镜像,执行命令时注意区分docker compose(V2)和docker-compose(V1)。 - 不需要修改Docker Socket的所有者,只要容器内执行命令的用户拥有
/var/run/docker.sock的读写权限即可,默认root用户可正常访问。
内容的提问来源于stack exchange,提问作者DevDavid
相关产品推荐
相关产品推荐

