Назад | Перейти на главную страницу

Проблема с 64-битными (хост) индексными дескрипторами по сравнению с 32-битными индексными дескрипторами в osxfs в контейнере Ubuntu 16.04

У меня возникла проблема, и я хочу получить отзывы о правильном способе решения с помощью «докеров». Я считаю, что это специфичный для Docker для Mac, поскольку при монтировании привязки используется osxfs, а inodes - 64-битные, а не 32-битные. В отличие от файловых систем, таких как cifs, которые позволяют использовать «noserverino», osxfs, похоже, не имеет возможности позволить клиенту определять inodes, а не смонтированную систему.

Я создал базовый образ докера на основе Ubuntu 16.04.

    FROM ubuntu:16.04@sha256:ea1d854d38be82f54d39efe2c67000bed1b03348bcc2f3dc094f260855dff368

    RUN dpkg --add-architecture i386
    RUN apt-get update && apt-get install -y \
      bzip2 \
      expect \
      file \
      gtk2-engines-murrine:i386 \
      libgtk2.0-0:i386 \
      libxtst6:i386 \
      lib32stdc++6 \
      libxt6:i386 \
      libdbus-glib-1-2:i386 \
      libasound2:i386 \
      make \
      maven \
      openjdk-8-jdk \
      patch \
      python \
      rsync \
      swig \
      unzip \
      vim \
      wget \
      && rm -rf /var/lib/apt/lists/*

Этот образ предназначен для использования на сервере в качестве общей среды сборки для разработчиков. Он также включает коммерческий кросс-компилятор для более старого 32-разрядного встроенного устройства. Для целей этого объяснения образ докера называется «кросскомпилятор».

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

Итак, ПРОБЛЕМА: поскольку кросс-компилятор представляет собой 32-битный набор инструментов, он полагается на включение библиотек i386, которые я включил в приведенный выше файл Dockerfile.

Чтобы использовать это изображение для компиляции кода, мы можем запустить что-то вроде следующего:

docker run --rm -ti --volume=/path/to/source/code/to/build:/root/workspace crosscompiler /bin/sh -c “cd /root/workspace && ./build.sh”

build.sh запускает сценарий, который собирает весь код. Проблема в том, что это 32-битный кросс-компилятор, который выполняет такие функции, как stat (который в нашем старом кросс-компиляторе не поддерживает большие файлы, то есть 64-битные inodes). Когда контейнер Ubuntu монтирует каталог hosts, содержащий исходный код, все inodes являются 64-разрядными, а 32-разрядные инструменты GNU Tools рассматривают эти файлы как Value too large for defined data type. В настоящее время я не знаю, как сказать osxfs (то есть совместное использование файловой системы macOS, используемое с Docker для Mac).

Каков был бы предложенный способ решить такую ​​проблему?

Цель здесь - позволить легко скомпилировать локальные изменения исходного кода на хосте в контейнере. Он будет использоваться локально или в среде непрерывной сборки, поэтому выгодно предложить элегантное и устойчивое решение.

Недавно столкнулся с подобной проблемой. Чтобы обойти эту проблему, я попытался смонтировать свою рабочую область как 32-разрядный том nfs, следуя инструкциям в Эта статья с некоторой настройкой. Я изменился nfsvers параметр mount равен 2, чтобы файловая система была 32-битной (индексный дескриптор).

Вот фрагмент docker-compose.yml для справки.

  workspace_nfs:
    driver: local
    driver_opts:
      type: nfs
      o: "addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=2"
      device: ":${PWD}"

Надеюсь на эту помощь.