Контейнер Docker дает разные результаты ls -f (readdir) на разных хостах linux - PullRequest
1 голос
/ 15 января 2020

Мы пытаемся использовать контейнеры docker, чтобы сделать наши сборки программного обеспечения повторяемыми в базовой среде. Один из инструментов в наборе инструментов сборки (Wind River) называется mkromfs, он захватывает файлы в определенной папке, преобразует их в файловую систему, которая затем загружается в ROM на платформе targert (которая является встроенным устройством, но это не важно). Вот). Проблема заключается в том, что эта утилита использует порядок файлов в файловой системе и дает разные результаты, когда я запускаю контейнер на Linux RHEL host, и разные результаты, когда я запускаю его на Linux VM (Docker для Windows с * 1031). * поддержка контейнеров включена, я не знаю, что внутри Linux дистрибутива ...). По сути, то же самое можно быстро воспроизвести, сгенерировав папку с файлами a и b , а затем выполнив ls -f для папки, разные хосты дают файлы в разных порядок (хотя результаты кажутся повторяемыми для этих указанных c хостов).

Контейнер, который мы используем, основан на последней версии Ubuntu, но та же проблема возникла, если я попробую другие базовые образы, похоже, что она полагается на хост-система, а не контейнер (я предполагаю, что она как-то использует файловую систему хоста, но я думал, что докеры используют union FS).

Теперь, конечно, я не хочу рисковать, что кто-то попытается повторить сборку на немного другом хосте Linux в будущем и приведет к другому результату. Я также понимаю, что порядок ls -f (или readdir () внутри) определяется ОС и файловой системой. Я также не могу изменить утилиту mkromfs, так как нет доступного ей источника.

Мои попытки и идеи были таковы:

  • У меня есть папка в контейнере с предсказуемой файловой системой (по крайней мере, та же самая), поэтому я хотел смонтировать что-то вроде ramfs или tmpfs, к сожалению, это, похоже, не разрешено в контейнерах (дает разрешение запрещено)
  • Взломать наш контент romfs, чтобы сделать его одним файлом, чтобы упорядочение не имело значения (мне это не нравится, потому что это означает Модификация нашего конечного продукта из-за технологии интеграции, это последнее средство для меня ...)
  • Переключитесь на виртуальные машины для повторяемости. (Я абсолютно хочу этого избежать, контейнеры намного меньше и быстрее ...)
  • Добавить требования для файловой системы, используемой для docker изображений, машина RHEL, которую мы используем, имеет ее в файловой системе ext3, у меня нет попробовал еще, а также я не уверен, может ли это помочь, плюс я до сих пор не знаю, какую файловую систему делают Linux Хосты виртуальных машин в Windows Докеры используют или как это выяснить ...

Есть ли способ сохранить контейнерный подход docker и повторить этот процесс? В идеале не было бы никакой разницы в выполнении сборки в контейнере на удаленном Linux хосте, как на моей Windows 10 машине, работающей Docker с поддержкой Linux. Я новичок во всей docker технологии контейнеров и частично также Linux, я, должно быть, что-то упустил ...

1 Ответ

0 голосов
/ 15 января 2020

Я нашел решение, работающее для моего случая, вот оно на тот случай, если кому-то еще понадобится это в будущем:

docker run -t -d --mount type=tmpfs,destination=/build myimage

Таким образом, каталог / build в контейнере использует одну и ту же файловую систему на всех машинах. (по крайней мере пока так). Подробнее об этом на https://docs.docker.com/storage/tmpfs/.

С этим изменением ls -f и утилита дают одинаковые результаты.

...