【问题标题】:how to mount docker-compose command from host into docker-container如何将 docker-compose 命令从主机挂载到 docker-container
【发布时间】:2021-07-07 16:46:10
【问题描述】:

我想在 docker 容器中运行 docker-compose startdocker-compose stop。 等效地,可以简单地尝试成功运行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-container。

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

【问题讨论】:

  • 为什么要在容器内运行docker-compose --version?听起来像是 XY 问题。
  • duplicati 是一个备份软件。这可以对任意存储进行非常简单的顺序备份。我想备份我的 docker 文件夹。因此,我必须阻止那些第一个 bec。包含的数据库。使用docker-compose downdocker-compuse up -d 之后,这可以非常简单地完成。 docker-compose --version 仅用于测试 docker-compose 是否正常工作

标签: docker docker-compose dockerfile duplicati


【解决方案1】:

如果你想在你的容器中运行docker-compose,你需要将它安装在你的镜像的 Dockerfile 中。在这方面没有真正好的捷径。

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。)更一般地说,将二进制文件从主机绑定到容器往往不会顺利,因为应用程序可以在 @ 中包含共享库依赖项或内容等内容987654327@ 不会出现在容器中。

同样在 Compose 的特定情况下,实际运行它会很尴尬,因为您需要将包含 docker-compose.yml 的主机目录绑定挂载到容器中才能使用它。一般来说,任何可以访问主机的 Docker 套接字的东西都可以非常简单地根植整个主机。我会认真考虑是否有另一种方式来运行您的高级应用程序,而无需在容器内进行 Compose。

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

【讨论】:

  • 好的,谢谢。我意识到出于我的目的,没有docker-compose 将是更好的解决方案。仅在 duplicati 中启动和停止容器将是多余的。纯 docker 命令就足够了。
  • 尽可能使用native Docker SDK;如果没有,使用相同的方法安装 Docker CLI 将比绑定安装主机的 docker 二进制文件更可靠。对安全问题要非常小心,因为调用docker 的shell 注入攻击可以非常直接地root 整个主机。
猜你喜欢
  • 2019-02-08
  • 2019-04-10
  • 2021-05-24
  • 1970-01-01
  • 2019-12-08
  • 2017-04-15
  • 2019-10-25
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多