如何控制 docker 从容器内组合容器?

How to control docker compose containers from within container?

我有一个 docker 组合文件的最小可复制示例,我希望能够从 docker 容器(docker 中控制所有 docker 组合服务]-在-docker).

例子docker-compose.yml:

version: '3'

services:
  redis:
    image: redis

  node:
    image: node

首先我开始:docker compose -f docker-compose.yml up -d

当我在 docker 主机上 运行 docker compose ps 时,我得到正确的输出:

NAME      COMMAND                  SERVICE             STATUS              PORTS
node-1    "docker-entrypoint.s…"   node                exited (0)          
redis-1   "docker-entrypoint.s…"   redis               running             6379/tcp

运行 来自具有绑定 docker 套接字的容器内的相同命令,如

docker run -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /current_directory/:/tmp/ \
  docker/compose -f /tmp/docker-compose.yml ps

未列出容器:

Name   Command   State   Ports
------------------------------

我知道 docker/compose 运行s 在 docker 上编写版本 1.26.2,但甚至使用 docker compose v2.1.1 and running the same (adopted) command produces an empty list, too. I also tried the approach described here 构建我自己的容器并设置所有者套接字文件,但结果与以前相同。

设置有问题吗?我如何控制 docker 从容器中组合容器?


Docker主机信息:

Docker Compose version v2.1.1
Client:
 Cloud integration: v1.0.20
 Version:           20.10.10
 API version:       1.41
 Go version:        go1.16.9
 Git commit:        b485636
 Built:             Mon Oct 25 07:43:15 2021
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.10
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.9
  Git commit:       e2f740d
  Built:            Mon Oct 25 07:41:30 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.11
  GitCommit:        5b46e404f6b9f661a205e28d59c982d3634148f8
 runc:
  Version:          1.0.2
  GitCommit:        v1.0.2-0-g52b36a2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Compose 具有项目名称 的概念。 Compose 在其使用项目名称创建的容器上设置一个标签,并在以后使用它来查找容器。更明显的是,项目名称也是默认容器、网络和卷名称的一部分;如果您 docker network ls 并看到 somename_default,则嵌入了项目名称。

默认项目名称是当前目录的基本名称,但您可以设置一个COMPOSE_PROJECT_NAME environment variable来覆盖它。在您的示例中,您正在 运行ning /tmp/docker-compose.yml,因此默认项目名称是 tmp,但这与您从主机获得的 运行 不匹配。您可以在启动容器时手动设置此环境变量:

docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /current_directory/:/tmp/ \
  -e COMPOSE_PROJECT_NAME=$(basename $(pwd)) \  # <-- add this
  docker/compose -f /tmp/docker-compose.yml ps

有一个等效的 docker-compose -p 选项,但您需要始终记住在每次调用时使用它。

docker run --rm -it \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /current_directory/:/tmp/ \
  docker/compose \
  -f /tmp/docker-compose.yml \
  -p $(basename $(pwd)) \       # <-- instead of -e COMPOSE_PROJECT_NAME
  ps