как смонтировать команду docker-compose с хоста в docker-контейнер

Я бы хотел бежать docker-compose start а также docker-compose stopвнутри докер-контейнера. Точно так же можно просто попытаться успешно бежать.

Мне уже удалось получить docker --version run, просто добавьте две строки (см. ниже).

Контейнер, похоже, использует Ubuntu 18.04 LTS.

В Докер-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-compose как минимум, чтобы я мог запускать docker-compose внутри контейнера?

1 ответ

Решение

Если вы хотите работать изнутри вашего контейнера, вам необходимо установить его в 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 с задействованными зависимостями библиотек, поэтому вам нужен точный Python от хоста и трудно определяемое подмножество /usr/lib/python3дерево. (См., Например, этот список файлов из Debian Buster docker-compose package.) В более общем смысле, монтирование двоичных файлов с хоста в контейнер имеет тенденцию не работать, поскольку приложения могут иметь такие вещи, как зависимости разделяемой библиотеки или контент в /usr/share который не появится в контейнере.

Также в конкретном случае Compose, на самом деле запустить это будет неудобно, так как вам нужно привязать-смонтировать каталог хоста, содержащий docker-compose.ymlв контейнер, чтобы иметь возможность использовать его. И вообще, все, что имеет доступ к сокету Docker хоста, может довольно просто получить root права для всего хоста. Я бы сильно подумал, есть ли другой способ запустить ваше приложение более высокого уровня, не требующий 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
Другие вопросы по тегам