Что на самом деле
У меня есть сервер (EX42) и ящик для хранения (BX21), оба размещены в Hetzner. На сервере работает экземпляр peertube, и я хочу сохранить данные в ящике для хранения.
я установил sshfs
на моем корневом сервере Debian 10 и смонтировал ящик для хранения:
/etc/fstab
:
<user>@<user>.your-storagebox.de:/data /peertube/data fuse.sshfs ssh_command=sshpass\040-f\040/peertube/sftp.pass\040ssh,uid=999,gid=999,allow_other ,disable_hardlink,transform_symlinks,reconnect,_netdev 0 0
Я смонтировал файловую систему со следующими параметрами в отношении символических ссылок:
-o отключить_жесткую ссылку
link(2) вернется с errno, установленным в ENOSYS. Жесткие ссылки
в настоящее время не работают идеально на sshfs, и это смущает
некоторые программы. Если это произойдет, попробуйте отключить жесткие ссылки.
с этой опцией.
-o transform_symlinks
преобразовать абсолютные символические ссылки в относительные
Затем я запускаю Peertube внутри докера и монтирую папку в этот контейнер.
пиртуб:
тома:
- активы:/приложение/клиент/расстояние
- /peertube/данные/peertube:/данные
- /peertube/данные/config:/config
сети:
- По умолчанию
Эта проблема
Я запускаю экземпляр peertube с докером и пытаюсь установить плагин с помощью этой команды:
$: NODE_ENV=production NODE_CONFIG_DIR=/config yarn plugin:install -n peertube-plugin-chapters
Вывод показал, что возникла ошибка при создании симлинка
пряжа запустить v1.22.17
...
2022-03-29 09:35:16.286 ошибка: не удается установить плагин peertube-plugin-chapters, удаляя его... {
"ошибка": {
"ошибка": {
"stack": "Ошибка: сбой команды: пряжа добавить [email protected]\nпредупреждение package.json: нет поля лицензии\nпредупреждение Нет поля лицензии\nошибка Произошла непредвиденная ошибка: \"EIO: ошибка ввода/вывода , символическая ссылка '../../../marked/bin/marked' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n\n в дочернем процессе .exithandler (узел:child_process:399:12)\n at ChildProcess.emit (узел:events:526:28)\n at ChildProcess.emit (узел:домен:475:12)\n at mayClose (узел:internal/ child_process:1092:16)\n в Process.ChildProcess._handle.onexit (узел:internal/child_process:302:5)",
"message": "Команда не выполнена: пряжа добавить [email protected]\nпредупреждение package.json: нет поля лицензии\nпредупреждение Нет поля лицензии\nошибка Произошла непредвиденная ошибка: \"EIO: ошибка ввода-вывода, символическая ссылка '../../../marked/bin/marked' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n",
"убит": ложь,
"код": 1,
"сигнал": ноль,
"cmd": "yarn add [email protected]"
},
"stdout": "[1/4] Разрешение пакетов...\n[2/4] Получение пакетов...\n[3/4] Связывание зависимостей...\ninfo Если вы считаете, что это ошибка, пожалуйста, откройте отчет об ошибке с информацией, представленной в \"/data/plugins/yarn-error.log\".\ninfo Посетите https://yarnpkg.com/en/docs/cli/add для получения документации по этой команде.\n ",
"stderr": "предупреждение package.json: поле лицензии отсутствует\nпредупреждение поле лицензии отсутствует\nошибка Произошла непредвиденная ошибка: \"EIO: ошибка ввода-вывода, символическая ссылка '../../../marked/bin/marked ' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n"
}
}
...
{
err: Ошибка: команда не удалась: пряжа добавить [email protected]
предупреждение package.json: нет поля лицензии
предупреждение Нет поля лицензии
error Произошла непредвиденная ошибка: «EIO: ошибка ввода-вывода, символическая ссылка '../../../marked/bin/marked' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/. корзина/отмечено'".
в ChildProcess.exithandler (узел:child_process:399:12)
в ChildProcess.emit (узел: события: 526: 28)
в ChildProcess.emit (узел:домен:475:12)
at mayClose (узел: внутренний/дочерний_процесс:1092:16)
at Process.ChildProcess._handle.onexit (узел: внутренний/дочерний_процесс:302:5) {
убит: ложь,
код: 1,
сигнал: ноль,
cmd: 'пряжа добавить [email protected]'
},
стандартный вывод: '[1/4] Разрешение пакетов...\n' +
'[2/4] Получение пакетов...\n' +
'[3/4] Связывание зависимостей...\n' +
'info Если вы считаете, что это ошибка, откройте отчет об ошибке с информацией, представленной в "/data/plugins/yarn-error.log".\n' +
'info Посетите https://yarnpkg.com/en/docs/cli/add для получения документации по этой команде.\n',
stderr: 'предупреждение package.json: нет поля лицензии\n' +
'предупреждение Нет поля лицензии\n' +
`error Произошла непредвиденная ошибка: «EIO: ошибка ввода-вывода, символическая ссылка '../../../marked/bin/marked' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/ .bin/отмечено'".\n`
}
ошибка Команда завершилась неудачно с кодом выхода 255.
Но когда я заглядываю в эту папку, я вижу, что символическая ссылка была создана и работает.
$: ls -la /data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/
всего 12
drwxr-xr-x 1 peertube peertube 3 29 марта 09:35 .
drwxr-xr-x 1 peertube peertube 3 29 марта 09:35 ..
lrwxr-xr-x 1 peertube peertube 26 мар 29 09:35 отмеченный -> ../../../отмеченный/бен/отмеченный
$: cat /data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked
#!/usr/bin/env узел
/**
* Отмечено CLI
* Copyright (c) 2011-2013, Кристофер Джеффри (лицензия MIT)
*/
const fs = требуется ('fs'),
путь = требуется('путь'),
отмечен = требуется ('../');
/**
* справочная страница
*/
функция помощи() {
const spawn = require('child_process').spawn;
постоянные параметры = {
cwd: процесс.cwd(),
среда: процесс.env,
....
Поэтому я попробовал это сам внутри контейнера, создав файл, создав символическую ссылку и изменив его.
$: эхо "Привет" > /данные/плагины/привет
$: кот /данные/плагины/привет
Привет
----
$: ln -s /data/plugins/hello /data/plugins/hello_link
ln: не удалось создать символическую ссылку '/data/plugins/hello_link': ошибка ввода/вывода
----
$: кошка /данные/плагины/hello_link
Привет
----
$: echo "Мир" >> /data/plugins/hello_link
----
$: кот /данные/плагины/привет
Привет
Мир
----
$: ls -la /данные/плагины/
всего 40
drwxr-xr-x 1 peertube peertube 10 29 марта 09:38 .
drwxr-xr-x 1 peertube peertube 16 мар 29 06:32 ..
drwxr-xr-x 1 peertube peertube 2 28 марта 16:48 .DAV
drwxr-xr-x 1 peertube peertube 3 28 марта 16:48 данные
-rw-r--r-- 1 peertube peertube 12 мар 29 09:38 привет
lrwxr-xr-x 1 peertube peertube 5 29 марта 09:38 hello_link -> привет
drwxr-xr-x 1 peertube peertube 6 29 марта 06:35 node_modules
-rw-r--r-- 1 peertube peertube 76 28 марта 16:48 package.json
-rw-r--r-- 1 peertube peertube 1248 29 марта 09:35 yarn-error.log
-rw-r--r-- 1 peertube peertube 413 28 мар 16:48 yarn.lock
пер -с
команда выдает ошибку, но в остальном все выглядит нормально и работает как положено.
Что я пробовал
Я также пытался смонтировать хранилище с этой опцией
-o Follow_symlinks
переходить по симлинкам на сервере
но все, что он делает, это ломает файлы, и я больше не могу их удалять, когда целевой файл ссылки больше не существует. Итак, я снова удалил эту опцию.
Я спросил службу поддержки, поддерживается ли символическая ссылка, и ответ был «да, поддерживается».
Когда я создаю симлинки напрямую на сервере, все работает без проблем.
Я попытался смонтировать папку внутри контейнера в ту же папку, что и на сервере
/etc/fstab
:
<user>@<user>.your-storagebox.de:/data /var/peertube/data fuse.sshfs ssh_command=sshpass\040-f\040/peertube/sftp.pass\040ssh,uid=999,gid=999 ,allow_other,disable_hardlink,transform_symlinks,reconnect,_netdev 0 0
пиртуб:
тома:
- активы:/приложение/клиент/расстояние
- /var/peertube/данные:/var/peertube/данные
- /peertube/данные/config:/config
сети:
- По умолчанию
но это не помогло.
Вопрос
Мне кажется, что как только я монтирую sshfs внутри контейнера докеров, он не может создавать символические ссылки без этого сообщения об ошибке.
Что мне нужно сделать, чтобы заставить его работать внутри докера?