Именованные каналы в папке контейнера докеров, подключенные к файловой системе Mac OS X через boot2docker

Я работаю над упаковкой научного программного обеспечения в образ докера с помощью boot2docker в Mac OS X. И это программное обеспечение (https://github.com/voutcn/megahit.git) использует именованные каналы (в коде Python, но это не важно) для подключения различных частей (написанных на C) друг к другу. Я монтирую временную папку с хост-машины 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

person rsutormin    schedule 19.11.2015    source источник


Ответы (1)


Обновите Docker для Mac до последней версии, и ваша проблема, скорее всего, будет решена: https://docs.docker.com/docker-for-mac/release-notes/#beta-2-release-2016-03-08-1102-beta2

Проблема в том, что FIFO на самом деле являются объектами ядра, к которым вы обращаетесь с помощью файловой системы, и поэтому вам потребуется дополнительная работа для поддержки кросс-ядерных FIFO (или сокетов домена unix) - FIFO действителен либо внутри гостевой системы Linux, на которой запущен демон docker, либо в хост OS X, а не в обоих, и имеет смысл, что вы не можете создать FIFO OS X изнутри окна Linux. Это было бы похоже на попытку создать FIFO на сетевом диске, это не имеет смысла в качестве локального механизма IPC.

Текущая поддержка специальных файлов подробно описана в https://docs.docker.com/docker-for-mac/osxfs/#file-types

Проблема с поддержкой кросс-гипервизора находится по адресу https://github.com/docker/for-mac/issues/483

person Roee Shenberg    schedule 18.04.2017