Как наиболее простым образом собирать докер-контейнеры для разных env?
Доброго дня.
Нужно собрать проект по-разному для разных env (prod, dev). Проект собирается через docker-compose (там несколько контейнеров).
Почитал в интернете, кто-то предлагает просто назвать dockerfile иначе и указывать нужный явно через -f, кто-то предлагает создать shell-скрипт для инкапсуляции установочной логики и вызывать его внутри dockerfile, но никто не написал, как сделать так, чтобы:
- был .env файл
- при запуске docker-compose up этот файл читался, оттуда брался ENV
- в зависимости от ENV выбирался docker-compose.{env}.yaml и dockerfile.{env} для каждого из контейнеров (если сборка из директории, а не из образа)
При этом хотелось бы избежать велосипедов с шелл-скриптами и прочим подобным. Докер же должен предоставлять что-то из коробки - вроде бы стандартная хотелка, не так уж и много, а как сделать - не нашел, и судя по всему, будет лютый костыль.
Можно ли достичь вышеописанного, и если да, то как? Если нельзя, то какой способ сборки проекта под разные окружения порекомендуете вы?
- в зависимости от 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 .
Условий в compose-файле задавать нельзя, соответственно если вы хотите задавать логику, то она должна работать до вызова docker-compose. Соответственно либо разные compose-файлы писать, либо из шаблонов собирать нужный.
При этом хотелось бы избежать велосипедов с шелл-скриптами и прочим подобным. Докер же должен предоставлять что-то из коробки - вроде бы стандартная хотелка, не так уж и много, а как сделать - не нашел, и судя по всему, будет лютый костыль.
Велосипед - это когда что-то готовое уже есть. Докер никому ничего не должен, кроме обратной совместимости и фикса багов. Про "не так уж и много" - напишите и сделайте pull request, ссылку только сюда приложить не забудьте. Костыль будет ровно таким, каким вы его напишите.