Том Overlayfs в контейнер докеров

У меня есть набор каталогов, которые я хотел бы наложить на монтирование в контейнер:

# On host
/opt/a
  - bin
  - lib
/opt/b
  - bin
  - lib
/opt/c
  - bin
  - lib

# In container
/usr/local
  - bin
  - lib
  - cuda

Я могу создать монтирование overlayfs на хост-машине для /opt/{a,b,c} и смонтируйте его как том в /usr/local в контейнере, но потом /usr/local/cuda будет недоступен в контейнере.

Я могу добиться этого напрямую с помощью systemd-nspawn со следующим:

systemd-nspawn --overlay /opt/a:/opt/b:/opt/c:/usr/local <other flags>

Это делает все файлы доступными как объединенное монтирование в /usr/local в контейнере с изменениями, записанными в /opt/c на хосте.

Можно ли легко добиться того, чего я хочу, с помощью докера?

1 ответ

Нет. Если вы достаточно знакомы с инструментами хоста, чтобы попытаться это сделать, рассмотрите возможность запуска его в chroot вместо этого окружающая среда.

Docker не имеет возможности объединить содержимое изображений, содержимое тома и каталоги хост-системы. Монтирование работает так же, как и обычная команда Unix mount(8): то, что вы монтируете, полностью скрывает все, что было раньше, и вы видите только смонтированное содержимое.

Также необычно запускать контейнер, который сильно зависит от содержимого хост-системы. Как правило, образ включает весь код приложения и библиотеки, необходимый для запуска программного обеспечения; таким образом вы можете запустить его в другой системе, даже если это программное обеспечение отсутствует на хосте. То есть более типично устанавливать необходимое программное обеспечение прямо в Dockerfile, например, apt-get installдля образов на основе Debian/Ubuntu. Если различные /optвещи - это вещи, которые вы собираете из исходного кода, вы можете использовать многоступенчатую сборку, чтобы установить их из исходного кода, а затем на последнем этапе COPY --from=opt-a-build в /usr/local дерево.

Другие вопросы по тегам