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

Еще один вопрос о символической ссылке 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 or ADD symlink/file.txt /path/file.txt

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

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


person Ravi    schedule 07.08.2015    source источник


Ответы (6)


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

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

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

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

https://superuser.com/questions/842642/how-to-make-a-symlinked-folder-appear-as-a-normal-folder

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

$ tar -czh . | docker build -
person jdabrowski    schedule 15.07.2020
comment
Я получаю 2 ошибки: tar: Failed to clean up compressor, Error response from daemon: the Dockerfile (Dockerfile) cannot be empty - person Ivan Rubinson; 25.12.2020
comment
@IvanRubinson похоже на проблему с командой tar, а не на мое решение, может быть, отсутствие привилегий? - person jdabrowski; 20.02.2021

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

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

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

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

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

person shaunc    schedule 24.06.2018

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

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

person Ilya Kolesnikov    schedule 07.06.2019

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

ln /some/file ./hardlink
person Eugene    schedule 14.06.2020
comment
Чтобы было ясно, это работает для файлов, а не для каталогов. - person GDorn; 30.06.2020
comment
Жесткая ссылка работает! Спасибо за идею! Однако, если у вас есть файлы с жесткими ссылками, а некоторые нет, будьте осторожны при обновлении файлов. Обновление файла жесткой ссылки приведет к изменению файла в других каталогах! И файлы жестких ссылок не будут отображаться разными цветами при использовании символьной ссылки ls like. Так что используйте его осторожно! - person HAltos; 02.04.2021

Мне просто нужно было решить эту проблему в том же контексте. Мое решение - использовать иерархические сборки Docker. Другими словами:

parent_dir
  - common_files
    - Dockerfile
    - file.txt

- dir1
    - Dockerfile (FROM common_files:latest)

Недостатком является то, что вам нужно не забывать строить common_files до dir1. Преимущество состоит в том, что если у вас есть несколько зависимых изображений, они все немного меньше из-за использования общего слоя.

person Chris Smith    schedule 28.01.2021