35

У меня есть два приложения Dart, которые мне нужно докеризировать. Эти два приложения используют общий исходный каталог.
Поскольку Docker не позволяет добавлять файлы из папок вне контекстного каталога (project/app1), я не могу добавлять файлы ни из ../shared ни из shared ресурса (символическая ссылка внутри projects/app1).

Я в любом случае ищу способ обмануть Докера.

Моя упрощенная структура проекта

- projects
  - app1
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - app2
   - Dockerfile
   - shared (symlink ../shared)
   - otherSource
  - shared
    - source

Я мог двигаться Dockerfile один уровень вверх и запустить docker build оттуда , но потом мне нужно два Dockerfiles (для App1 и app2) в том же каталоге.

Моя текущая идея заключалась в том, что если бы я мог каким-то образом скрыть тот факт, что projects/app1/shared является символической ссылкой, эта проблема была бы решена. Я проверил, могу ли я делиться projects с помощью Samba, перемонтировать его где-то еще и настроить Samba для обработки символических ссылок, как обычные папки, но не нашел, поддерживается ли это (у меня нет большого опыта работы с Samba, и я еще не пробовал, просто немного искал ).

Есть ли другой инструмент или трюк, который позволил бы это?

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

2 ответа2

30

У меня нет большого опыта работы с docker поэтому я не могу обещать, что это сработает, но одним из вариантов будет монтировать каталог вместо ссылки на него:

$ cd projects/app1
$ mkdir shared
$ sudo mount -o bind ../shared shared/

Это прикрепит ../shared к ./shared и должно быть полностью прозрачным для системы. Как объяснено в man mount:

Привязка крепится.

Начиная с Linux 2.4.0, можно перемонтировать часть файловой иерархии куда-то еще. Вызов:

mount --bind olddir newdir

или используя эту запись fstab:

/olddir /newdir none bind

После этого вызова одно и то же содержимое доступно в двух местах.

20

Эта проблема неоднократно поднималась в сообществе Docker. Это в основном нарушает требование, что Dockerfile должен повторяться, если вы запускаете его или я запускаю его. Поэтому я не ожидал, что эта возможность, как описано в этом билете: команда Dockerfile ADD не следует по символическим ссылкам на хосте # 1676.

Таким образом, вы должны представить себе другой подход. Если вы посмотрите на эту проблему: ADD для поддержки символических ссылок в аргументе # 6094, наш друг из U & L (@Patrick aka. Phemmer) предлагает хитрый обходной путь.

$ tar -czh . | docker build -

Это говорит tar о необходимости разыменовать символические ссылки из текущего каталога, а затем направить их все в команду docker build - .

выдержка из страницы руководства tar
-c, --create
       create a new archive

-h, --dereference
       follow symlinks; archive and dump the files they point to

-z, --gzip, --gunzip --ungzip

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .