Docker слідує за символічним посиланням поза контекстом


88

Ще одне запитання щодо посилання на Docker. У мене є купа файлів, які я хочу скопіювати у всі свої збірки Docker. Моя структура каталогу:

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

У наведеному вище прикладі я хочу, щоб файл file.txt був скопійований під час збирання докера всередині dir1. Але я не хочу зберігати кілька копій file.txt. За цим посиланням, станом на версію docker 0.10 , docker build повинен бути

Дотримуйтесь символьних посилань у корені контейнера, щоб отримати інструкції щодо складання 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 :

Ми не дозволяємо цього, оскільки це не можна повторити. Символьне посилання на вашій машині не те саме, що на моїй машині, і той самий файл Docker дасть два різні результати. Крім того, наявність символьних посилань на / etc / paasswd може спричинити проблеми, оскільки воно пов'язуватиме файли хоста, а не ваші локальні файли.


Дякую. Так, я раніше помічав це посилання, але думав, що це стосується набагато старішої версії docker (0.6.1). У журналі змін 0.10 вказується, що
Раві,

Крім того, якщо "батьківський_директор" відмічено на будь-якому комп'ютері і якщо символічне посилання має відносний шлях до "загальних_файлів", воно буде повторюваним.
Раві

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' копій спільного файлу здається занадто високою з точки зору обслуговування. Можливо, мені доведеться подавати його з apache. Дякую.
Раві

18
яка ганьба, поки я бачу сенс, я не слідую логіці, і це мене кусає. Git чудово обробляє симбінки, і я також очікую, що збірки працюватимуть на всіх машинах і в середовищах, де перевіряється вихідне репо ..?!
Грегор

9

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

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

(Або еквівалентно, у дочірньому каталозі,)

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

Файл Docker потрібно буде налаштувати для копіювання / додавання з відповідними шляхами. Залежно від ваших налаштувань, ви можете хотіти, .dockerignoreщоб батько виключив речі, які ви не хочете вводити в контекст.


4

Якщо хтось все ще має цю проблему, я знайшов дуже приємне рішення на superuser.com:

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

В основному пропонується використовувати tar для розмежування символічних посилань та подачі результату у збірку докера:

$ tar -czh . | docker build -

Як змусити це працювати за допомогою docker-compose?
vitalets

2

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

отже, конфігурація вашого сайту буде в одній копії лише в папці site_available, якщо вона зупинена або щось інше, або в sites_enabled, якщо її слід використовувати


1

Я знаю, що це порушує портативність збірки docker, але ви можете використовувати жорсткі посилання замість символічних:

ln /some/file ./hardlink

3
Щоб бути зрозумілим, це працює для файлів, а не каталогів.
GDorn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.