Рейтинг:0

Файловая система, смонтированная с помощью sshfs, выдает ошибку внутри докера при создании символической ссылки

флаг us

Что на самом деле

У меня есть сервер (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 внутри контейнера докеров, он не может создавать символические ссылки без этого сообщения об ошибке.

Что мне нужно сделать, чтобы заставить его работать внутри докера?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.