Чи слід використовувати Dockerfiles чи коміти зображення?


81

Я трохи заплутаний у цих двох варіантах. Здається, вони пов’язані між собою. Однак вони насправді не сумісні.

Наприклад, здається, що використання файлів Dockerfiles означає, що ви не повинні насправді робити коміти для зображень, тому що ви насправді повинні просто відстежувати файл Docker у git і вносити в нього зміни. Тоді не виникає двозначності щодо того, що є авторитетним.

Однак, коміти з зображеннями здаються справді приємними. Це настільки чудово, що ви можете просто змінити контейнер безпосередньо і позначити зміни, щоб створити інше зображення. Я розумію, що ви навіть можете отримати щось на зразок файлової системи, що відрізняється від історії фіксації зображень. Приголомшливо Але тоді ви не повинні використовувати Dockerfiles. В іншому випадку, якщо ви зробили коміт зображення, вам доведеться повернутися до вашого файлу Docker і внести деякі зміни, які відображають те, що ви зробили.

Тож я розірвана. Мені подобається ідея комітів зображення: що вам не потрібно представляти стан свого зображення у Dockerfile - ви можете просто відстежувати його безпосередньо. Але мені неприємно відмовлятися від ідеї якогось файлу маніфесту, який дає вам швидкий огляд того, що є на зображенні. Неприємно також бачити дві функції в одному програмному пакеті, які здаються несумісними.

Хтось має якісь думки з цього приводу? Чи вважається поганою практикою використання комітів зображення? Або я повинен просто відмовитись від вкладення, щоб маніфестувати файли з моїх лялькових днів? Що я повинен зробити?

Оновлення :

Я не настільки впевнений у всіх, хто вважає, що це питання, засноване на думках. У цьому є деякі суб’єктивні якості, але я думаю, що це здебільшого об’єктивне питання. Крім того, я вважаю, що хороша дискусія на цю тему буде інформативною.

Врешті-решт, я сподіваюся, що хтось, хто читає цю публікацію, краще зрозуміє, як Dockerfiles та коміти для зображень співвідносяться між собою.

Оновлення - 2017/7/18 :

Нещодавно я виявив правомірне використання комітів зображень. Ми щойно створили конвеєр CI у нашій компанії, і на одному етапі конвеєра наші тести програм запускаються всередині контейнера. Нам потрібно отримати результати покриття з контейнера, що вийшов, після того, як процес тестового запуску їх створив (у файловій системі контейнера) і контейнер перестав працювати. Для цього ми використовуємо коміти image, фіксуючи зупинений контейнер для створення нового зображення, а потім виконуючи команди, які відображають і скидають файл покриття в stdout. Тож зручно це мати. Окрім цього цілком конкретного випадку, ми використовуємо Dockerfiles для визначення нашого середовища.


2
Тут багато філософії, і філософія людей різниться, що робить це, можливо, поганим питанням для СО. Однак моя власна філософія - ви завжди хочете точно знати, як відтворити дане зображення, і будьте впевнені, що можете це зробити. Використовуючи золоті зображення, дуже легко не знати, як хтось перейшов із стану А у стан Б, тоді як з автоматизацією, яка керує процесом побудови, забути неможливо. Отже, особисто, так, я називаю Dockerfiles правильною справою, і образ чинить зло (як будь- який золотий образ, який для побудови покладається на ручне втручання) зло. Але це я і YMMV.
Чарльз Даффі

@CharlesDuffy Куди має піти це запитання, якщо воно не належить до SO?
Девід Сандерс,

1
@CharlesDuffy До речі, я не згоден, що це питання, засноване на думках. Тут повинна бути правильна відповідь, якщо не правильна відповідь, яка залежить від трохи більше контексту. FYI, я проголосував, щоб перенести своє запитання до Serverfault.
Девід Сандерс,

2
... * знизати плечима *. Я можу навести конкретні причини своїх уподобань, але чи робить це їх більше правильними, ніж конкретні причини, які хтось інший наводить для своїх? Я працював з людьми, які є шанувальниками підходу "золотого іміджу", і не завжди вдається завоювати когось, посилаючись на факти, оскільки партії можуть оцінювати різні характеристики в рішенні різною мірою, тому цілком можливо домовитись про факти але розходяться з висновками. Що є відмітною ознакою питання, заснованого на думках, і що я очікую побачити, якщо насправді з’являться тут якісь золоті фанати зображень.
Чарльз Даффі

1
Мені цікаво те саме, і мені здається (що може бути абсолютно неправильним), що це справді той самий випадок, що і у vms -> ви не хочете не знати, як відтворити зображення vm. У моєму випадку у мене є регулярні скрипти .sh для встановлення, і мені цікаво, чому я не можу просто підтримувати їх, запускати docker і ефективно викликати їх, і створювати образ золотої версії таким чином. Мої сценарії працюють, щоб його встановити на локальний ПК, і причиною, за якою я хочу використовувати докер, є вирішення конфліктів декількох екземплярів програм / чиста файлова система / тощо
Бредфорд Медейрос,

Відповіді:


47

Dockerfiles - це інструмент, який використовується для створення зображень.

Результатом запуску docker build .є зображення з комітом, тому неможливо використовувати файл Docker без створення коміту . Питання полягає в тому, чи слід оновлювати зображення вручну кожного разу, коли що-небудь змінюється, і тим самим прирікати себе на прокляття золотого зображення ?

Прокляття золотого образу - це жахливе прокляття, кинуте на людей, які повинні продовжувати жити з баггі, захищеним діркою безпеки, для запуску свого програмного забезпечення, тому що людину, яка його створила, давно поглинули древні (або перейшли на нова робота), і ніхто не знає, звідки у них версія образної магії, яка увійшла в цей образ. і є єдиним, що буде пов’язувати модуль c ++, який надав той консультант, якого син боса найняв три роки тому, і в будь-якому випадку це не має значення, бо навіть якщо ви зрозуміли, звідки imagemagic походить із версії libstdc ++, яку використовує JNI викликає в інструменті підтримки, що стажер зі створеним довгим волоссям і так існує лише у непідтримуваній версії ubuntu.


3
Насправді це здається мені суттю проблеми. Якщо ви використовуєте виключно коміти з зображеннями, ви застрягли у своєму базовому зображенні. Ви можете зробити дист-апгрейд зображення, але це просто звучить як кошмар. Здається, набагато краще, щоб така інформація була подана чисто у Dockerfile. Я вважаю, що Docker не повинен був виставляти коміти для зображень як частину свого публічного API. Здається, для них не існує законного використання, окрім цілей ілюстрації у вступній документації.
Девід Сандерс

7
Я не просто придумав цей приклад ... :-(
Артур Ульфельдт

22

Знання як переваг, так і незручностей рішень - це хороший початок. Тому що поєднання обох цих, мабуть, дійсний шлях.

Недолік: уникайте золотого тупика:

Використовувати лише коміти - це погано, якщо ви втрачаєте інформацію про те, як перебудувати свій образ. Ви не хочете перебувати в такому стані, що не можете відновити образ . Цей кінцевий стан тут називають золотим образом оскільки зображення буде вашим єдиним орієнтиром, початковою та кінцевою точками на кожному етапі. Якщо ви втратите його, у вас будуть значні проблеми, оскільки ви не можете відновити його. Фатальним тупиком є ​​те, що одного дня вам потрібно буде відновити новий (оскільки всі системні бібліотеки застаріли, наприклад), і ви не будете уявляти, що встановлювати ... що закінчується великою втратою часу.

Як додаткове зауваження , ймовірно, що використання комітів над комітами було б приємніше, якщо журнал історії був би зручним для використання (зверніться до розбіжностей і повторіть їх на інших зображеннях), як це є у git: ви помітите, що git не має ця дилема.

Pro: гладкі оновлення для розповсюдження

З іншого боку, багатошарові коміти мають суттєву перевагу з точки зору розподілених модернізацій, а отже, пропускної здатності та часу розгортання. Якщо ви почнете обробляти образи докера, коли пекар обробляє млинці (що якраз і дозволяє докер), або хочете миттєво розгорнути тестову версію, вам буде приємніше надіслати лише невелике оновлення у вигляді невеликого коміту, а цілком новий образ. Особливо при постійній інтеграції для ваших клієнтів, де виправлення помилок слід застосовувати найближчим часом і часто.

Спробуйте отримати найкраще з двох світів:

У цьому типі сценаріїв ви, мабуть, захочете позначити основну версію своїх зображень, і вони повинні надходити Dockerfiles. А ви можете надавати версії безперервної інтеграції завдяки комітам, заснованим на тегованій версії. Це пом'якшує переваги та незручності сценарію Dockerfiles і комірування шарів. Тут ключовим моментом є те, що ви ніколи не припиняєте відстежувати свої зображення, обмежуючи кількість комітів, які ви дозволяєте робити з ними.

Отже, я думаю, це залежить від вашого сценарію, і вам, мабуть, не слід намагатися знайти єдине правило. Однак, можливо, є деякі реальні тупикові ситуації, яких ви дійсно повинні уникати (як закінчення сценарію "золотого образу"), незалежно від рішення.


Хіба Docker розумно не відновлює зображення так, що вам не потрібно знімати ціле нове зображення для розгортання після того, як ви відбудували з модифікованого Dockerfile?
Девід Сандерс,

1
@DavidSanders Ви не закінчите завантаженням нових зображень, ви маєте рацію щодо цього. Але будь-яка рання інструкція, яка спричиняє зміни, призведе до недійсності цілих наступних шарів. Відомо, що "ADD" або будь-яка інструкція залежності часто є інструкціями, які ви можете зробити наприкінці за допомогою одного нового коміту, але якщо ви відновите свій файл Docker, він створить цілі нові шари. Деякі зусилля були докладені навколо "ADD", щоб бути більш розумним github.com/docker/docker/issues/880 , див. Також, дотримуючись подібних проблем jpetazzo.github.io/2013/12/01/docker-python-pip-requirements
vaab
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.