Подтвердить что ты не робот

Могу ли я монтировать каталог хоста docker как копию при записи/наложении?

Я хотел бы установить хост-каталог в докере, который снаружи фактически доступен для чтения/только. Но я хотел бы, чтобы он появился внутри контейнера как чтение/запись.

Чтобы файлы/каталоги могли быть записаны, но не изменены снаружи. Возможно ли это, используя какой-либо процесс наложения?

4b9b3361

Ответ 1

Изменение: Проверьте @javabrett комментарий:

Проголосовано, несмотря на то, что это решение имеет закат, см. Ответ на вопрос об отключении overlay-upperdir -o n -o на ядрах 4.8 и новее. - Джавабретт 23 июля в 5:55

См.: fooobar.com/questions/312329/...


Вот что я делаю:

На хосте:

Загрузите каталог только для чтения.

docker run --privileged -v/path/on/host: /path/on/client-read-only:ro -it ubuntu/bin/bash

На клиенте:

На клиенте используйте OverlayFS поверх только что прочитанного каталога -o, смонтированного с хоста.

mount -t overlayfs none -o lowerdir=/path/on/client-read-only,upperdir=/path/on/client/path/on/client

Затем используйте /path/on/client для чтения/записи файлов.

Редактировать: если у вас есть 3. 18+ ядро на вашем хосте, вы можете предпочесть использовать это на клиенте:

mount -t overlay overlay -o lowerdir=/path/on/client-read-only,upperdir=/path/on/client,workdir=/path/on/client-workdir/path/on/client

Который не overlayfs. С overlayfs меня была проблема, связанная с невозможностью использования rm. overlay решил эту проблему для меня.

Ответ 2

Больше не поддерживается изнутри контейнера (возможно, потому что overlay-over-overlay отключен в ядрах ~ 4.4)

$ uname -a && \
  docker run --privileged --rm debian:latest sh -c "mkdir upper lower work merged && mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged/; dmesg|tail -1"


Linux preprod 4.9.0-6-amd64 #1 SMP Debian 4.9.88-1+deb9u1 (2018-05-07) x86_64 GNU/Linux

mount: wrong fs type, bad option, bad superblock on overlay,
       missing codepage or helper program, or other error

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

[288426.860631] overlayfs: filesystem on 'upper' not supported as upperdir

В любом случае альтернативой является создание оверлея на хосте и привязка его к гостю:

$ mkdir upper lower work merged && \
  touch upper/up lower/low && \
  sudo mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged/ && \
  docker run --rm -v $(pwd)/merged:/tmp/merged debian:latest sh -c "touch /tmp/merged/new-from-container"

$ ls upper/lower/merged/

lower/:
low

merged/:
low  new-from-container  up

upper/:
new-from-container  up

Ответ 3

Я бы рекомендовал посмотреть, поддерживает ли ваша файловая система overlayfs или нет; и его можно проверить с помощью

  $> cat /proc/filesystems | grep overlayfs
  $> overlayfs overlay

Если это так, то я бы рекомендовал вам создать overlayfs на хост-машине и смонтировать каталог слияния в контейнер Docker, чтобы вы могли управлять вещами с главной машины, а не с некоторых на хосте, а некоторые на контейнере Docker.

Я выполнил следующие шаги для этого: позвольте мне привести пример; У меня есть исходный код, и я хочу построить его для нескольких платформ, таких как i386, x86_64 и amd64; Исходный код останется таким же для всей платформы; где, поскольку исполняемый файл (.obj и exe) каждой платформы будет отличаться; поэтому нам нужен исполняемый файл в каждом конкретном каталоге платформы

 sudo  mount -t overlay overlay -o lowerdir=/home/viswesn/source-code,upperdir=/home/viswesn/i386_executable,workdir=/i386 /home/viswesn/i386_merged

 sudo  mount -t overlay overlay -o lowerdir=/home/viswesn/source-code,upperdir=/home/viswesn/x86_64_executable,workdir=/x86_64 /home/viswesn/x86_64_merged

В нем говорится, что любые файлы объектов или исполняемые файлы, созданные из исходных файлов, будут оставаться в каталоге /home/viswesn/X _executable, а исходный код останется в /home/viswesn/source -code; где as/home/viswesn/X_merged/будет содержать исходный код и исполняемый файл конкретной платформы;

Теперь мы должны установить каталог X_merged как том в контейнер Docker для создания исходного кода для каждой платформы

Для i386:

 sudo docker run --privileged -v /home/viswesn/i386_merged/:/source-code -it ubuntu-trusty:14:01 /bin/bash

Для amd64:

sudo docker run --privileged -v /home/viswesn/amd64_merged/:/source-code -it ubuntu-amd64:14:01 /bin/bash

При этом один и тот же исходный код одновременно создается для всей платформы параллельно без нескольких копий исходного кода.

Ответ 4

Это возможно, если вы избегаете установки upperdir на локальный каталог (то есть уже наложение). Но вместо этого вы можете использовать tmpfs (протестировано на ядре 4.9):

# On the host to run the container
docker run --cap-add=SYS_ADMIN -i -t -v ~/host-folder-to-mount:/root/folder-ro:ro ubuntu

# Inside the container
# Need to create the upper and work dirs inside a tmpfs.
mkdir -p /tmp/overlay && \
mount -t tmpfs tmpfs /tmp/overlay && \
mkdir -p /tmp/overlay/{upper,work} && \
mkdir -p /root/folder && \
mount -t overlay overlay -o lowerdir=/root/folder-ro,upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work /root/folder

Все кредиты идут на https://gist.github.com/detunized/7c8fc4c37b49c5475e68ef9574587eee