2015-11-19 30 views
6

我正在使用Mac OS X上的boot2docker通過docker映像包裝一些科學軟件。並且該軟件(https://github.com/voutcn/megahit.git)使用命名管道(在python代碼,但並不重要)將不同的部分(用C寫成)互相連接。我安裝的臨時文件夾從主機Mac OS X的機器在泊塢窗容器提供刮開區(因爲軟件臨時輸出可能是巨大的),像這樣的東西:在Docker容器文件夾中的命名管道通過boot2docker掛載到mac os x文件系統

docker run -v /external/folder:/tmp/scratch <image> <args> 

它給了我的內心容器這種坐騎行:

none on /tmp/scratch type vboxsf (rw,nodev,relatime) 

而在這個掛載的文件夾中,當它在容器中運行時,命名管道創建失敗。它甚至與Python,C或任何特定語言都沒有關係。我雙擊此文件夾中使用Linux命令mkfifo pipe1檢查一個錯誤:

mkfifo: cannot create fifo 'pipe1': Operation not permitted 

它非常適用於任何內部沒有安裝文件夾內的容器,雖然。爲什麼會發生這種情況,如何解決? PS:這是我做的事情,很容易重現問題。

1)的Mac OS X具有boot2docker

2)Dockerfile是:

FROM ubuntu:14.04 
#WORKDIR /tmp <- this one would work 
WORKDIR /tmp/scratch 
ENTRYPOINT [ "mkfifo" ] 
CMD [ "pipe1" ] 

3)圖像建築物:

docker build --rm -t mine/namedpipes:latest . 

4)運行(在外部主機的文件夾是爲安裝):

docker run -v $(pwd):/tmp/scratch mine/namedpipes:latest 

回答

1

升級到Docker for Mac的最新版本,並且您的問題可能會得到解決:https://docs.docker.com/docker-for-mac/release-notes/#beta-2-release-2016-03-08-1102-beta2

問題是,FIFO實際上是使用文件系統訪問的內核對象,因此您需要額外的工作來支持跨內核FIFO(或unix域套接字) - fifo可以在運行docker守護進程的Linux客戶機內或在OS X主機中有效,而不是在兩者中都有效,並且從Linux內部無法創建OS X fifo是有道理的。這有點像試圖在網絡驅動器上創建一個fifo,它作爲一個本地IPC機制是沒有意義的。

特殊文件目前的支撐在https://docs.docker.com/docker-for-mac/osxfs/#file-types

跨虛擬機管理程序支持問題位於https://github.com/docker/for-mac/issues/483

詳細
相關問題