Как создать жесткую ссылку на файл в томе докера - PullRequest
1 голос
/ 27 марта 2019

Я нахожусь в процессе рефакторинга и «dockerization» унаследованного приложения, созданного из сценариев оболочки, двоичных файлов 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

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

Есть ли способ создать жесткие ссылки на томах докера?

1 Ответ

2 голосов
/ 28 марта 2019

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

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

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

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

...