Как создать жесткую ссылку на файл в томе docker

#docker #hardlink

#docker #жесткая ссылка

Вопрос:

Я нахожусь в процессе рефакторинга и «настройки» устаревшего приложения, состоящего из сценариев оболочки, двоичных файлов C и различных пакетов с открытыми исходными кодами (среди которых httpd)

Есть ли способ создать в контейнере docker жесткие ссылки на файлы, расположенные в томе docker?

Я планирую спроектировать контейнеры следующим образом:

 services:
  legacy-app:
    image: my-legacy-app
    volumes:
      - http-files:/var/www/html/

  httpd:
    image: httpd:2.4
    volumes:
      - http-files:/usr/local/apache2/htdocs/

volumes:
  http-files:
  

Некоторые сценарии инициализации в устаревшем приложении создают жесткие ссылки в каталоге /var/www /html/, указывающие на другие файлы в файловой системе.
Теперь они возвращают следующие ошибки :

 ln: creating hard link `/var/www/html/1/application' to `/home/conf/application': Invalid cross-device link
  

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

Есть ли способ создать жесткие ссылки между томами docker?

Ответ №1:

Нет, нет способа сделать то, что вы хотите.

Проблема в том, что Linux запрещает жесткие ссылки в разных файловых системах. В вашем случае, /home/conf/application принадлежит корневой файловой системе контейнера, которая смонтирована в / (это может быть overlay mount или aufs , или что-то еще), в то время как том ( /var/www/html/ и все, что находится в этом каталоге) принадлежит другой файловой системе, которая находится в /var/lib/docker каталоге хоста (или где бы ваш том ни находился на хосте).

Но это еще не все. Для обеспечения соблюдения ограничения «нет жестких ссылок между файловыми системами», когда вы пытаетесь создать жесткую ссылку, ядро проверяет, что монтируемые файлы, к которым принадлежат источник и место назначения, совпадают. Это означает, что даже если источник и место назначения принадлежат одной и той же файловой системе, но также принадлежат разным точкам монтирования, создание жесткой ссылки по-прежнему запрещено.

Следствием этого является то, что вы не можете создать жесткую ссылку между различными томами Docker, даже если эти тома принадлежат одной файловой системе. Наконец, даже если вы монтируете один и тот же том в разные места в контейнере, вы все равно не сможете создать жесткие ссылки между этими местами, поскольку они все еще принадлежат разным установкам.