У меня возникла проблема, и я хочу получить отзывы о правильном способе решения с помощью «докеров». Я считаю, что это специфичный для 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}"
Надеюсь на эту помощь.