хочу какой-то файл скопировать в образ, но не в исходном виде, а в каком-то нормализованном
Для примера, есть человекочитаемый ./foo.json с отступами, но я не хочу его копировать в образ как есть (например, он слишком большой по сравнению с компактной версией), а хочу сначала пропустить его через jq --compact-output . и уже результат этой команды сохранить в качестве слоя
Или как альтернативный пример — пропустить некоторый конфиг через grep -v, чтобы убрать кучу лишних комментариев, которые нужны в исходниках, но совершенно избыточные внутри образа
Это возможно?
UPD: почему не внешний инструмент: мне нужен самодостаточный докерфайл, я не хочу, чтобы сборка образа зависела ещё от какой-то внешней инфраструктуры
UPD: мне подсказали сделать это через multistage. Да, можно, должно сработать, но если есть способ сделать проще и лаконичнее — я бы предпочёл его
Привет мултестейдж куда уже проще
Он требует бойлерплейта. В идеале, хотелось бы, чтобы для RUN была какая-то опция, которая умела бы скармливать на вход своей команды файл из репозитория, не скопированный в образ
так ты копируешь такой файлик оригинальный потом в run используешь его (сжимаешь) и создаешь нужный файлик, удаляя шаблон потом эти файлики можно целиком скорпировать в другое место (образ)
Мультистейдж для тебя будет проще делаешь что-то типо: FROM stedolan/jq COPY foo.json /tmp/foo.json RUN jq .. > /tmp/final.json FROM main-image:blabla COPY --from=0 /tmp/final.json . и погнал
Альтернативный вариант собери свой baseimage со всеми инструментами что тебе нужны и в процессе сборки вызывай jq
Я же написал, что знаю, как это делается, меня смущает лишь бойлерплейтность решения. Вы же согласитесь, что гипотетический RUN --stdin-file=foo.json jq -c . был бы лучшим решением?
Возможно, никогда не задумывался о таких оптимизациях
Нет, необязательно. Самое лаконичное, но не самое тривиальное или легкочитаемое. Там выше верно пишут что чем проще и предсказуемее тем лучше. Простота настолько чтобы любой джун даже через 3 года поздно ночью мог сразу же разобраться и починить. ) Но это мне так кажется, могу ошибаться)
Правда считаете, что COPY --from=0 /tmp/final.json . и ещё 3 дополнительные строчки в начале файла будут понятнее, чем одна RUN --stdin-file=foo.json jq -c .?
Обсуждают сегодня