2015-11-19 23 views
6

Sto lavorando per l'involucro di alcuni software scientifici di immagine docker utilizzando boot2docker su Mac OS X. E quel software (https://github.com/voutcn/megahit.git) sta usando named pipe (in python codice, ma non è importante) per collegare tra loro parti diverse (scritte in C). Monto cartella temporanea da host Mac OS X macchina per fornire zona zero in contenitore di finestra mobile (a causa di uscita temporanea del software potrebbe essere enorme) con qualcosa di simile:Tubi denominati nella cartella contenitore docker montata su mac os x file system tramite boot2docker

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

Mi dà questa linea di montaggio all'interno del contenitore:

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

E all'interno di questa cartella montata denominata creazione di pipe non riesce quando viene eseguito all'interno del contenitore. Non è nemmeno correlato a Python, C o una particolare lingua. Ho ricontrollato con comando di Linux mkfifo pipe1 in questa cartella con un errore:

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

funziona bene per qualsiasi cartella interna non montato all'interno del contenitore però. Perché succede e come potrebbe essere risolto?

PS: Ecco cosa faccio per riprodurre facilmente il problema.

1) Mac OS X con boot2docker

2) Dockerfile è:

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

3) costruzione Image:

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

4) esecuzione (essendo nella cartella host esterno per essere montato):

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

risposta

1

Aggiornamento a una versione recente di Docker per Mac, e probabilmente il problema verrà risolto: https://docs.docker.com/docker-for-mac/release-notes/#beta-2-release-2016-03-08-1102-beta2

Il problema è che i FIFO sono in realtà oggetti del kernel a cui si accede utilizzando il filesystem, e quindi è necessario un lavoro extra per supportare FIFO cross-kernel (o unix domain sockets) - un fifo è valido all'interno del guest Linux che esegue il daemon docker o nell'host di OS X, non in entrambi, e ha senso che non sia possibile creare un OS X fifo dall'interno della finestra di Linux. Sarebbe come cercare di creare un fifo su un disco di rete, non ha senso come meccanismo IPC locale.

attuale di sostegno ai file speciali è dettagliato in https://docs.docker.com/docker-for-mac/osxfs/#file-types

Il problema per il supporto cross-hypervisor si trova a https://github.com/docker/for-mac/issues/483