我有一個 docker compose 檔案的最小可重現示例,我希望能夠從 docker 容器(docker-in-docker)中控制所有 docker compose 服務。
示例 docker-compose.yml:
version: '3'
services:
redis:
image: redis
node:
image: node
首先我從以下幾點開始: docker compose -f docker-compose.yml up -d
當我docker compose ps在 docker 主機上運行時,我得到了正確的輸出:
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在 docker compose 版本 1.26.2 上運行,但即使使用 docker compose v2.1.1構建我自己的容器并運行相同(采用的)命令也會產生一個空串列。我還嘗試了此處描述的方法,設定套接字檔案的所有者,但結果與以前相同。
設定有問題嗎?如何從容器內控制 docker compose 容器?
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
uj5u.com熱心網友回復:
Compose 具有專案名稱的概念。Compose 在它使用專案名稱創建的容器上設定一個標簽,然后使用它來查找容器。更明顯的是,專案名稱也是默認容器、網路和卷名稱的一部分;如果您docker network ls看到somename_default,則嵌入了專案名稱。
默認專案名稱是當前目錄的基本名稱,但您可以設定COMPOSE_PROJECT_NAME環境變數來覆寫它。在您的示例中,您正在運行,/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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368177.html
