Докер следует символической ссылке вне контекста

88

Еще один вопрос о символической ссылке Docker. У меня есть куча файлов, которые я хочу скопировать во все свои сборки Docker. Моя структура каталога:

parent_dir
    - common_files
        - file.txt
    - dir1
        - Dockerfile  
        - symlink -> ../common_files

В приведенном выше примере я хочу, чтобы файл file.txt копировался при сборке докеров внутри dir1. Но я не хочу поддерживать несколько копий file.txt. По этой ссылке, начиная с версии докера 0.10 , сборка докера должна

Следуйте символическим ссылкам внутри корня контейнера для инструкций по сборке ADD.

Но у меня нет такого файла или каталога, когда я создаю любую из этих строк в моем Dockerfile:

ADD symlink /path/dirname или ADD symlink/file.txt /path/file.txt

вариант монтирования НЕ решит эту проблему для меня (кроссплатформенность ...). Я безуспешно пытался tar -czh . | docker build -t.

Есть ли способ заставить Docker следовать символической ссылке и скопировать common_files / file.txt во встроенный контейнер?

Рави
источник

Ответы:

68

Это невозможно и не будет реализовано. Пожалуйста, ознакомьтесь с обсуждением проблемы github # 1676 :

Мы не допускаем этого, потому что это неповторимо. Символьная ссылка на вашем компьютере - это не то же самое, что и на моем компьютере, и тот же файл Dockerfile даст два разных результата. Также наличие символических ссылок на / etc / paasswd вызовет проблемы, потому что он будет связывать файлы хоста, а не ваши локальные файлы.

0x7d7b
источник
Спасибо. Да, я заметил эту ссылку раньше, но я думал, что это для гораздо более старой версии докера (0.6.1). В журнале изменений версии 0.10 упоминается, что это возможно github.com/docker/docker/blob/master/…
Рави,
Также, если "parent_dir" извлечен на любом компьютере, и если символическая ссылка имеет относительный путь к "common_files", он будет повторяться.
Рави,
2
Ваша цитата Follow symlinks inside container's root for ADD build instructions.означает, что внутри контейнера следуют символические ссылки. Не в каталоге контекста сборки. В ADD file.txt /dir/file.txtкаталоге dirможет быть символическая ссылка. Аргументы, которые я привел в своем ответе, все еще действительны, а символические ссылки все еще не поддерживаются в последней версии. Вы можете столкнуться с проблемами (относительно повторяемости), когда храните символические ссылки в системах контроля версий, таких как git . Поэтому обратитесь к этому вопросу .
0x7d7b
1
Я понимаю вашу точку зрения относительно символических ссылок в git. Но символические ссылки не обязательно должны входить в git. Простой сценарий установки может подготовить локальный env для создания символических ссылок. Для меня стоимость хранения n копий общего файла кажется слишком высокой с точки зрения обслуживания. Может придется подавать из апача. Спасибо.
Рави,
18
Какой позор, хотя я вижу, что не следую логике, и это меня кусает. Git отлично обрабатывает символьные ссылки, и я также ожидаю, что сборки будут работать на всех машинах и средах, где проверяется исходный репозиторий ..?!
Грегор
9

Одна из возможностей - запустить сборку в родительском каталоге с помощью:

$ docker build [tags...] -f dir1/Dockerfile .

(Или, что то же самое, в дочернем каталоге)

$ docker build  [tags...] -f Dockerfile ..

Dockerfile необходимо настроить для копирования / добавления с соответствующими путями. В зависимости от ваших настроек вы можете захотеть, .dockerignoreчтобы родительский элемент исключал вещи, которые вы не хотите помещать в контекст.

Shaunc
источник
4

Если у кого-то все еще есть эта проблема, я нашел очень хорошее решение на superuser.com:

/superuser/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

Он в основном предлагает использовать tar для разыменования символических ссылок и передачи результата в сборку докера:

$ tar -czh . | docker build -
Jdabrowski
источник
Как заставить его работать с docker-compose?
Виталец
2

вместо использования simlinks можно решить проблему административно, просто переместив файлы из sites_available в sites_enabled вместо копирования или создания simlink

поэтому конфигурация вашего сайта будет в одной копии только в папке site_available, если она остановлена ​​или что-то в этом роде, или в sites_enabled, если ее следует использовать

Илья Колесников
источник
1

Я знаю, что это нарушает переносимость сборки докеров, но вы можете использовать жесткие ссылки вместо символических:

ln /some/file ./hardlink
Евгений
источник
3
Чтобы было понятно, это работает для файлов, а не для каталогов.
GDorn