2014-09-30 1 views
54

Я немного запутался в этих двух вариантах. Они, похоже, связаны между собой. Однако они не совсем совместимы.Должен ли я использовать файлы Dockerfiles или изображения?

Например, кажется, что использование Dockerfiles означает, что вы действительно не должны делать снимки, потому что вам действительно нужно просто отслеживать Dockerfile в git и вносить изменения в это. Тогда нет никакой двусмысленности в отношении того, что является авторитетным.

Однако изображения совершают впечатление действительно приятного. Это так здорово, что вы можете просто изменить контейнер непосредственно и пометить изменения, чтобы создать другое изображение. Я понимаю, что вы даже можете получить что-то вроде файловой системы diff от истории фиксации изображения. Потрясающие. Но тогда вы не должны использовать Dockerfiles. В противном случае, если вы сделали фиксацию изображения, вам придется вернуться к файлу Docker и внести некоторые изменения, которые представляют собой то, что вы сделали.

Так что я разорван. Мне нравится идея фиксации изображения: вам не нужно представлять ваше состояние изображения в файле Docker - вы можете просто отслеживать его напрямую. Но мне нелегко отказаться от идеи какого-либо файла манифеста, который дает вам краткий обзор того, что находится в изображении. Это также смущает видеть две функции в одном программном пакете, которые кажутся несовместимыми.

У кого-нибудь есть мысли по этому поводу? Является ли плохая практика использовать коммиты изображения? Или я должен просто отпустить мою привязанность к файлам манифеста из моих кукольных дней? Что мне делать?

Update:

Всем тем, кто думает, что это вопрос на основе мнений, я не так уверен. Есть некоторые субъективные качества, но я думаю, что это в основном объективный вопрос. Кроме того, я считаю, что хорошее обсуждение этой темы будет информативным.

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

Update - 2017/7/18:

Я только недавно обнаружил законное использование для изображения совершает. Мы только создали трубопровод CI в нашей компании, и на одном этапе трубопровода наши тесты приложений запускаются внутри контейнера. Нам нужно получить результаты покрытия из выходящего контейнера после того, как процесс тестового запуска выполнил их (в файловой системе контейнера), и контейнер перестает работать. Мы используем фиксацию изображения, чтобы сделать это, совершив остановленный контейнер для создания нового изображения, а затем запустив команды, которые отображают и выгружают файл покрытия в stdout. Так что это удобно для этого. Помимо этого особого случая, мы используем Dockerfiles для определения нашей среды.

+2

Здесь есть много философии, и философия народов отличается, что делает этот, возможно, плохим вопросом для SO. Однако моя собственная философия - вы всегда хотите точно знать, как воспроизвести данный образ, и быть уверенным, что вы это сделаете. Используя золотые изображения, очень легко не знать, как кто-то получил от состояния А до состояния В, тогда как с автоматизацией, которая управляет процессом сборки, не существует способа забыть. Итак, лично, да, я называю Dockerfiles the Right Thing, и изображение совершает (как * любой * вид золотого образа, который полагается на ручное вмешательство, чтобы строить) зло. Но это я, и YMMV. –

+0

@CharlesDuffy Где этот вопрос идти, если он не принадлежит на SO? –

+0

@CharlesDuffy Кстати, я не согласен с тем, что это вопрос, основанный на мнениях. Здесь должен быть правильный ответ, если не правильный ответ, который зависит от немного большего контекста. FYI, я голосовал, чтобы передать свой вопрос на Serverfault. –

ответ

26

Dockerfiles - это инструмент, который используется для создания изображений.

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

Проклятие золотого изображения - это страшное проклятие, которое бросает людей, которые должны продолжать жить с баггией безопасности, чтобы запустить свое программное обеспечение, потому что человек, который его создал, был давно поглощен древними (или перешел на новую работу), и никто не знает, где они получили версию imagemagic, которая попала в этот образ.и это единственное, что будет связано с модулем C++, который был предоставлен этим консультантом сыном босса, нанятым три года назад, и в любом случае это не имеет значения, потому что даже если вы выяснили, где imagemagic пришел из версии libstdC++, используемой JNI вызывает в инструменте поддержки, что стажер с длинными волосами, созданный, существует только в неподдерживаемой версии ubuntu.

+2

Это на самом деле кажется сердцем проблемы для меня. Если вы используете исключительно изображение, вы застряли в базовом изображении. Вы можете сделать dist-upgrade на изображении, но это просто похоже на кошмар. Кажется более предпочтительным иметь такую ​​информацию, представленную чисто в файле Docker. Я думаю, что Docker не должен был показывать изображения в качестве части своего публичного API. Похоже, что для них нет никакого законного использования, кроме как для иллюстрации во вводной документации. –

+3

Я не просто сделал этот пример ... :-( –

20

Зная оба решения, преимущества и неудобства - хорошее начало. Потому что сочетание двух, вероятно, является правильным способом.

Con: избежать золотого изображения тупика:

Использования только совершает это плохо, если вы теряете след, как восстановить свой имидж. Вы не хотите быть в состоянии, что вы не можете восстановить изображение. Это конечное состояние здесь называется золотым изображением, так как изображение будет вашим единственным эталоном, отправной точкой и конечной точкой на каждом этапе. Если вы потеряете его, у вас будет много проблем, так как вы не сможете его восстановить. Смертельный тупик заключается в том, что в один прекрасный день вам нужно будет перестроить новый (потому что все системные библиотеки устарели, например), и вы не знаете, что устанавливать ... заканчивая большой потерей времени.

В качестве примечания, вполне вероятно, что с помощью коммитов фиксаций бы лучше, если журнал истории будет легко использовать (консультируйтесь посмотреть различие и повторять их на других изображениях), как в мерзавце: вы заметите, что git не имеет этой дилеммы.

Pro: пятно обновления для распространения

В другой стороны, отводки фиксаций имеют некоторые значительные преимущества в плане распределенных обновлений и, таким образом, в полосе пропускания и развертывание времени. Если вы начинаете обрабатывать изображения докеров, поскольку пекарь обрабатывает блины (именно это разрешает докер) или хотите развернуть тестовую версию мгновенно, вам будет гораздо легче отправить небольшое обновление в виде небольшого коммита, а совершенно новый образ. Особенно, если у вас есть постоянная интеграция для ваших клиентов, где исправления ошибок должны быть развернуты быстро и часто.

Try, чтобы получить лучшее из двух миров:

В этом типе сценария, вы, вероятно, хотите, чтобы пометить основную версию ваших изображений, и они должны поступать из Dockerfiles. И вы можете обеспечить непрерывные версии интеграции, благодаря фиксации на основе помеченной версии. Это смягчает преимущества и неудобства сценариев Dockerfiles и слоев. Здесь ключевой момент заключается в том, что вы никогда не прекращаете отслеживать свои изображения, ограничивая количество коммитов, которые вы разрешите делать с ними.

Так что, я думаю, это зависит от вашего сценария, и вам, вероятно, не стоит пытаться найти одно правило. Тем не менее, могут быть некоторые реальные тупики, которые вы должны действительно избегать (как в конечном итоге с сценарием «золотого изображения») независимо от решения.

+0

Не Docker разумно перестраивает изображения, так что вам не нужно вытаскивать новое изображение для развертывания после того, как вы перестроили из модифицированного файла Docker? –

+1

@DavidSanders Вы не закончите загружать целые новые изображения, вы правы в этом. Но любая ранняя инструкция, которая исходит из изменений, приведет к недействительности целых следующих уровней. Неверно, «ADD» или любая инструкция зависимости часто являются инструкциями, которые вы можете сделать в конце с одним новым фиксатором, но если вы перестроете свой файл Dockerfile, он будет генерировать целые новые слои. Некоторые усилия были сделаны вокруг «ADD», чтобы быть более умными https://github.com/docker/docker/issues/880, см. Также, следуя аналогичным соображениям http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/ – vaab

Смежные вопросы