如何控制 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
我有一个 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