Как наиболее простым образом собирать докер-контейнеры для разных env?

Доброго дня.
Нужно собрать проект по-разному для разных env (prod, dev). Проект собирается через docker-compose (там несколько контейнеров).

Почитал в интернете, кто-то предлагает просто назвать dockerfile иначе и указывать нужный явно через -f, кто-то предлагает создать shell-скрипт для инкапсуляции установочной логики и вызывать его внутри dockerfile, но никто не написал, как сделать так, чтобы:
- был .env файл
- при запуске docker-compose up этот файл читался, оттуда брался ENV
- в зависимости от ENV выбирался docker-compose.{env}.yaml и dockerfile.{env} для каждого из контейнеров (если сборка из директории, а не из образа)

При этом хотелось бы избежать велосипедов с шелл-скриптами и прочим подобным. Докер же должен предоставлять что-то из коробки - вроде бы стандартная хотелка, не так уж и много, а как сделать - не нашел, и судя по всему, будет лютый костыль.

Можно ли достичь вышеописанного, и если да, то как? Если нельзя, то какой способ сборки проекта под разные окружения порекомендуете вы?

Заранее спасибо.
  • Вопрос задан
  • 214 просмотров
Решения вопроса 2
inf
@inf
DevOps Engineer
- в зависимости от ENV выбирался docker-compose.{env}.yaml и dockerfile.{env} для каждого из контейнеров (если сборка из директории, а не из образа)

Это так не работает. ENV задаётся сразу для определённого сервиса в docker-compose и для определённой сборки Dockerfile.

Я бы сделал нормальный CI в gitlab, например, и билды из веток для stage и production. Тут сам docker-compose не совсем предназначен для сборок и порождает костыли.

Удобней иметь один Dockerfile, а особые параметры передавать через --build-arg
docker build --build-arg ENV=stage .
Ответ написан
Комментировать
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
Условий в compose-файле задавать нельзя, соответственно если вы хотите задавать логику, то она должна работать до вызова docker-compose. Соответственно либо разные compose-файлы писать, либо из шаблонов собирать нужный.
При этом хотелось бы избежать велосипедов с шелл-скриптами и прочим подобным. Докер же должен предоставлять что-то из коробки - вроде бы стандартная хотелка, не так уж и много, а как сделать - не нашел, и судя по всему, будет лютый костыль.
Велосипед - это когда что-то готовое уже есть. Докер никому ничего не должен, кроме обратной совместимости и фикса багов. Про "не так уж и много" - напишите и сделайте pull request, ссылку только сюда приложить не забудьте. Костыль будет ровно таким, каким вы его напишите.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vitaly_il1
DevOps Consulting
Если вы предпочитаете использовать отдельные файлы для каждого env, то насколько понимаю, это очень просто:

1) ENV=xxxx
2) COMPOSE_FILE=docker-compose-$ENV.yml (или $ENV/docker-compose.yml)
3) DOCKERFILE=Dockerfile-$ENV.yml

и запускаем build
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы