Linux

Ubuntu 16.04 容器中 osxfs 中 64 位(主機)inode 與 32 位 inode 的問題

  • June 3, 2020

我有一個問題,我希望得到一些關於正確“docker”解決方法的回饋。我相信這是特定於 Mac 的 Docker,因為綁定掛載使用 osxfs 並且 inode 是 64 位,而不是 32 位。與 cifs 等允許使用“noserverino”的文件系統不同,osxfs 似乎沒有辦法讓客戶端確定 inode 而不是掛載的系統。

我創建了一個基於 Ubuntu 16.04 的基本 docker 鏡像

   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 位嵌入式設備的商業交叉編譯器。出於本說明的目的,docker 映像被命名為“crosscompiler”

使用 Ubuntu(特別是 16.04)對於虛擬機形式的開發人員來說沒有問題,但 Docker 的許多好處超過了 VM 方法。所以這個 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 位 inode)。當 Ubuntu 容器掛載包含原始碼的 hosts 目錄時,inode 都是 64 位的,而 32 位 GNU 工具將這些文件視為Value too large for defined data type. 目前,我不知道有什麼方法可以告訴osxfs(即與 Docker for Mac 一起使用的 macOS 文件系統共享)。

解決此類問題的建議方法是什麼?

  • 將我們的原始碼複製到每次啟動的容器中?
  • 不知何故使用 Docker ‘Volumes’ 以便容器自己建構文件?
  • 為 osxfs 配置類似“noserverino”的掛載的某種方式?
  • 其他選擇?

這裡的目標是允許在容器中輕鬆編譯主機上的本地原始碼更改。這將在本地或持續建構環境中使用,因此提出一個優雅且可持續的解決方案是有利的。

最近遇到了類似的問題。為了解決此問題,我嘗試按照本文中的說明進行一些調整,將我的工作區安裝為 32 位 nfs 卷。我將nfsvers掛載選項更改為 2 以確保文件系統是 32 位(inode)。

這是 docker-compose.yml 的片段供您參考。

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

希望這有幫助。

引用自:https://serverfault.com/questions/919784