Ubuntu 16.04 容器中 osxfs 中 64 位(主機)inode 與 32 位 inode 的問題
我有一個問題,我希望得到一些關於正確“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}"
希望這有幫助。