Создание общих зависимостей с помощью 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