如何将 docker-compose 命令从主机挂载到 docker-容器中

how to mount docker-compose command from host into docker-container

我想 运行 docker-compose startdocker-compose stop 在 docker 容器中。 等效地,可以简单地尝试 运行 docker-compose --version 成功。

我已经设法通过简单地添加两行(见下文)获得 docker --version 运行。

容器似乎使用 Ubuntu 18.04 LTS。

docker-compose 文件 如下所示:

---
version: "2.1"
services:
  duplicati-2:
    image: ghcr.io/linuxserver/duplicati
    container_name: duplicati-2
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - CLI_ARGS= #optional
    volumes:
      - ./config:/config
      - /mnt/myBackups:/backups
      - /opt/docker:/source:ro
#---------------------------------------------------------------------
#---------- needed to run docker -------------------------------------
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker

#---------------------------------------------------------------------
#------------what must stand down here to run docker-compose?---------
      - /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
      - /usr/bin/python3:/usr/bin/python3
#---------------------------------------------------------------------


    ports:
      - 8300:8200
    restart: unless-stopped

我已经在此处找到一般 运行 docker-compose --version 的要求: https://docs.docker.com/compose/install/

我担心 python3 等所需的所有依赖项和库。 当愚蠢地从主机安装整个 /lib/*/usr/bin 目录时,我不想用主机上的所有这些库污染我的 docker-容器。

所以我的问题是: 我必须至少将哪些安装添加到我的 docker-compose 文件中,以便我可以 运行 docker-compose 在容器中?

如果您想从容器中 运行 docker-compose,您需要将其安装到映像的 Docker 文件中。在这方面没有很好的捷径。

FROM ubuntu:20.04
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --assume-yes --no-install-recommends \
      docker-compose \
      docker.io

在 Compose 的特定情况下,它是一个包含库依赖项的 Python 应用程序,因此您需要来自主机的 exact Python 和一个/usr/lib/python3 树的难以指定的子集。 (例如,参见 Debian Buster docker-compose 包中的 list of files。)更一般地说,将二进制文件从主机绑定安装到容器中往往不会顺利进行,因为应用程序可能具有共享库依赖项之类的东西或 /usr/share 中不会出现在容器中的内容。

同样在 Compose 的特殊情况下,实际上 运行 这样做会很尴尬,因为您需要将包含 docker-compose.yml 的主机目录绑定挂载到容器中才能使用它。通常,任何可以访问主机的 Docker 套接字的东西都可以很容易地为整个主机建立根目录。我会认真考虑是否有另一种方法 运行 你的更高级别的应用程序不需要在容器中编写。

version: '3.8'
services:
  compose:
    build: .
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - .:/compose
    working_dir: /compose
    environment:
      COMPOSE_PROJECT_NAME: current-directory-name
    command: /bin/true
  web:
    image: busybox
    command: httpd -f -h /www
    volumes:
      - .:/www
    ports:
      - 80:80
# This will technically work
docker-compose run compose \
  docker-compose up -d web