Подкладываем файлы в докер в remote contextДопустим, есть вот такая структура папок:
my-cool-project-dev
|— docker-compose.yml
|— config.yml
|— my-cool-project
|— Dockerfile
Есть основная репа
my-cool-project, где всё чисто и красиво, а есть dev-окружение в отдельной репе, где мы тестим продукт в нужном нам окружении.
Как подложить конфиг в контейнер my-cool-project?Самое популярное решение: добавить в компоуз маунт
./config.yml:/config.yml:ro. Загвоздка в том, что моё тестовое окружение подразумевает запуск не в локальном докере, а на выделенной тачке, к которой клиентский докер подключён через
remote context (рекомендую изучить, невероятно полезная фича). Из-за него все маунты будут происходить не с локальной тачки, а с тачки, где крутится докер демон, т.е. с ремоут контекста.
Поэтому, если вы хотите запустить в компоузе какой-то готовый образ, например, traefik, то конфиг можно подложить в новый слой образа: делаем папку
traefik, кладём в неё конфиги и Dockerfile с директивами
FROM traefik и
COPY config.yml /config.yml, а в компоузе прописываем
build: traefik.
Однако, в рассмотренном примере уже есть Dockerfile, который мы не хотим менять, но от которого не можем как-то органично отпочковаться, чтобы подложить конфиг. Не, можно конечно каких-нибудь
build.sh скриптов понаписать, но мы ж хакеры, да?
Предлагаю вашему вниманию вот такой компоуз:
services:
app:
build:
context: my-cool-project
additional_contexts:
config: ./config
dockerfile_inline: |
# syntax = devthefuture/dockerfile-x
FROM ./Dockerfile
COPY --from=config /config.yml /config.yml
В папку
my-cool-project-dev/config мы кладём наши отладочные конфиги, добавляем их как дополнительный контекст для buildkit, и наконец, с помощью кастомного докерфайл-синтаксиса
dockerfile-x, создаём инлайн враппер для докерфайла, в котором инклудим оригинальный докерфайл и добавляем копирование конфига в образ.
Кстати, через механизмы configs и secrets сейчас тоже нельзя с локальной тачки прокинуть ничего в ремоут контекст, но совсем недавно появился
пулл-реквест с капибарой, который это фиксит (очень надеюсь, что его примут).