Что мне следует использовать: Dockerfiles или коммиты изображений?


81

Я немного запутался в этих двух вариантах. Похоже, они связаны. Однако они не совсем совместимы.

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

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

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

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

Обновление :

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

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

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

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


2
Здесь много философии, и философии людей различаются, поэтому, возможно, это плохой вопрос для SO. Однако моя собственная философия - вы всегда хотите точно знать, как воспроизвести данное изображение, и быть уверенным, что вы можете это сделать. Используя золотые образы, очень легко не знать, как кто-то перешел из состояния A в состояние B, тогда как с помощью автоматизации, которая управляет процессом сборки, забыть невозможно. Так что лично я называю Dockerfiles правильной вещью, а коммиты образа (как и любой другой золотой образ, для создания которого требуется ручное вмешательство) зло. Но это я и YMMV.
Чарльз Даффи

@CharlesDuffy Куда должен идти этот вопрос, если он не принадлежит SO?
Дэвид Сандерс

1
@CharlesDuffy Между прочим, я не согласен, что это вопрос, основанный на мнении. Здесь должен быть правильный ответ, если не правильный ответ, который зависит от немного большего контекста. К вашему сведению, я проголосовал за перенос своего вопроса в Serverfault.
Дэвид Сандерс

2
... * пожимает плечами *. Я могу привести конкретные причины своего предпочтения, но делает ли это их более правильными, чем конкретные причины, которые кто-то цитирует в пользу своих? Я работал с людьми, которые являются поклонниками подхода с использованием золотого образа, и не всегда возможно привлечь кого-то, цитируя факты, потому что стороны могут ценить разные характеристики в решении в разной степени, поэтому вполне возможно прийти к согласию по фактам. но не согласен с выводами. Что является отличительной чертой вопроса, основанного на мнении, и что я ожидаю увидеть, действительно ли у нас появятся фанаты золотого имиджа.
Чарльз Даффи

1
Мне было интересно то же самое, и у меня сложилось впечатление (которое могло быть совершенно неверным), что это действительно тот же случай, что и с vms -> вы не хотите не знать, как воссоздать образ vm. В моем случае у меня есть обычные сценарии .sh для установки, и мне интересно, почему я не могу просто поддерживать их, запускать докер и эффективно вызывать их и таким образом создавать образ золотой версии. Мои сценарии работают, чтобы установить его на локальный компьютер, и причина, по которой я хочу использовать докер, заключается в том, чтобы иметь дело с конфликтами нескольких экземпляров программ / иметь чистую файловую систему / и т. Д.
Брэдфорд Медейрос

Ответы:


47

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

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

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


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

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

22

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

Против: избегайте тупика с золотым изображением :

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

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

Плюс: удобные обновления для распространения

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

Попробуйте получить лучшее из двух миров:

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

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


Разве Docker не перестраивает образы разумно, так что вам не нужно загружать полностью новый образ для развертывания после перестройки из измененного файла Docker?
Дэвид Сандерс

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