Создание общих зависимостей с помощью docker-compose

Предполагая, что у меня есть набор изображений, которые зависят от общего базового изображения:

  • base (это всего лишь набор общих зависимостей)

    FROM ubuntu:16.04
    
    ENV FOO 1
    
  • child1

    FROM mybaseimage  # where mybaseimage corresponds to base
    
    CMD ["bar1_command"]
    
  • child2

    FROM mybaseimage  # where mybaseimage corresponds to base
    
    CMD ["bar2_command"]
    

Возможно ли создать файл docker-compose, который будет строить base без его запуска? Допустим, у меня есть следующие зависимости:

version: '2'
services:
    child1:
        build: ./path-to-child1-dockerfile
services:
    child2:
        build: ./path-to-child2-dockerfile
    depends_on:
        - child1

Я бы хотел, чтобы base строился, даже если он явно не запущен. Возможно ли что-то подобное? Или я должен просто использовать внешний Makefile для создания зависимостей?

build_base:
    docker build -t mybaseimage mybaseimage  

build_all: build_base
    docker-compose build

Ответ 1

Используйте Makefile. docker-compose не предназначен для создания цепей изображений, он предназначен для запуска контейнеров.

Вы также можете быть заинтересованы в dobi, который является инструментом автоматизации сборки (например, make), предназначенным для работы с изображениями и контейнерами докеров,

Отказ от ответственности: я являюсь автором dobi

Ответ 2

Это возможно. Там что-то вроде обходного пути. Вы близки, но вам не хватало ярких тегов изображений (так что у вас мало возможностей на дочерние образы, чтобы объявить, какое изображение вы унаследовали).

version: '3.2'
services:
  base:
    image: mybaseimage
    build: ./path-to-base-dockerfile
  child1:
    build: ./path-to-child1-dockerfile
    depends_on:
      - base
  child2:
    build: ./path-to-child2-dockerfile
    depends_on:
      - base

Скажем, у вас нет образов. Вы запустите docker-compose up. Произойдет следующее:

  • docker-compose видит, что службы child1 и child2 зависят от базы. Поэтому сначала он будет развертывать базу.
  • docker-compose видит, что вы еще не отметили какое-либо изображение как mybaseimage. Он знает, как построить mybaseimage (вы дали ему путь сборки), поэтому он будет его строить сейчас и пометьте как mybaseimage.
  • docker-compose развертывает службу base.
    • В идеале вы должны спроектировать base, чтобы он немедленно ушел или не имел точки входа. поскольку мы фактически не хотим, чтобы он запускал эту службу.
  • docker-compose рассматривает возможность развертывания child1 и child2
  • docker-compose видит, что вы еще не отметили какое-либо изображение как child1. Он знает, как построить child1 (вы дали ему путь сборки), поэтому он теперь будет его строить и помечает как child1.
  • docker-compose развертывает службу child1
  • та же последовательность шагов для child2

Следующий docker-compose up будет проще (у нас есть помеченные изображения, поэтому мы пропустим все шаги сборки).

Если у вас уже есть тегированные изображения и вы хотите перестроить: используйте docker-compose build, чтобы сказать ему, чтобы он построил все изображения (да, база и дети будут восстановлены).

Ответ 3

Вам не нужны отдельные изображения для этой проблемы - просто используйте переменную окружения:

FROM ubuntu:16.04

ENV PROGRAM

CMD ${PROGRAM}

Затем для контейнера 1 установите для переменной среды PROGRAM значение bar1_command. Сделайте то же самое для контейнера 2, 3,..., N.

Ответ 4

Это работает в docker-compose 1.8.1