Puncte:0

Sistemul de fișiere montat cu sshfs aruncă o eroare în interiorul docker atunci când se creează un link simbolic

drapel us

Ce este actual

Am un server (EX42) și o cutie de stocare (BX21) ambele găzduite la Hetzner. Pe server rulează o instanță peertube și vreau să salvez datele în caseta de stocare. am instalat sshfs pe serverul meu rădăcină Debian 10 și am montat caseta de stocare: /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

Am montat sistemul de fișiere cu următoarele opțiuni privind legăturile simbolice:

-o disable_hardlink
              link(2) va reveni cu errno setat la ENOSYS. Legături dure
              momentan nu funcționează perfect pe sshfs, iar acest lucru derutează
              unele programe. Dacă se întâmplă acest lucru, încercați să dezactivați linkurile hard
              cu această opțiune.

-o transform_symlinks
              transforma legăturile simbolice absolute în relative

Apoi pornesc Peertube în interiorul docker și montez folderul în acest container

 peertube:
    volume:
    - active:/app/client/dist
    - /peertube/data/peertube:/data
    - /peertube/data/config:/config
    retele:
    - Mod implicit

Problema

Rulez o instanță peertube cu docker și am încercat să instalez un plugin cu această comandă:
$: NODE_ENV=producție NODE_CONFIG_DIR=/config yarn plugin:install -n peertube-plugin-chapters
Rezultatul a arătat că există o eroare la crearea unui link simbolic

fire run v1.22.17
...
2022-03-29 09:35:16.286 eroare: Nu se poate instala pluginul peertube-plugin-chapters, eliminându-l... {
  „err”: {
    „err”: {
      "stack": "Eroare: Comanda a eșuat: yarn add [email protected]\nwarning package.json: Fără câmp de licență\nwarning Fără câmp de licență\nerror A apărut o eroare neașteptată: \"EIO: eroare i/o , link simbolic „../../../marked/bin/marked” -> „/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n\n la ChildProcess .exithandler (nod:child_process:399:12)\n la ChildProcess.emit (node:events:526:28)\n la ChildProcess.emit (node:domain:475:12)\n la maybeClose (nod:internal/ child_process:1092:16)\n la Process.ChildProcess._handle.onexit (nod:internal/child_process:302:5)",
      "message": "Comandă a eșuat: yarn add [email protected]\nwarning package.json: Fără câmp de licență\nwarning Fără câmp de licență\nerror A apărut o eroare neașteptată: \"EIO: eroare i/o, link simbolic '../../../marked/bin/marked' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n",
      „ucis”: fals,
      „cod”: 1,
      „semnal”: nul,
      "cmd": "Adăugați fire [email protected]"
    },
    "stdout": "[1/4] Se rezolvă pachetele...\n[2/4] Se preiau pachetele...\n[3/4] Se leagă dependențe...\ninfo Dacă credeți că aceasta este o eroare, vă rugăm deschideți un raport de eroare cu informațiile furnizate în \"/data/plugins/yarn-error.log\".\ninfo Vizitați https://yarnpkg.com/en/docs/cli/add pentru documentația despre această comandă.\n ",
    "stderr": "avertisment package.json: Fără câmp de licență\nwarning Fără câmp de licență\nerror A apărut o eroare neașteptată: \"EIO: eroare i/o, link simbolic '../../../marked/bin/marked ' -> '/data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked'\".\n"
  }
}
...
{
  err: Eroare: Comanda a eșuat: yarn add [email protected]
  avertisment package.json: Fără câmp de licență
  avertisment Fără câmp de licență
  eroare A apărut o eroare neașteptată: „EIO: eroare i/o, link simbolic „../../../marked/bin/marked” -> „/data/plugins/node_modules/peertube-plugin-chapters/node_modules/. bin/marcat'".
  
      la ChildProcess.exithandler (nod:child_process:399:12)
      la ChildProcess.emit (node:events:526:28)
      la ChildProcess.emit (nod:domain:475:12)
      la maybeClose (nod:internal/child_process:1092:16)
      la Process.ChildProcess._handle.onexit (nod:internal/child_process:302:5) {
    ucis: fals,
    cod: 1,
    semnal: nul,
    cmd: „yarn add [email protected]”
  },
  stdout: '[1/4] Se rezolvă pachetele...\n' +
    „[2/4] Se preiau pachetele...\n” +
    „[3/4] Se conectează dependențe...\n” +
    „info Dacă credeți că este o eroare, vă rugăm să deschideți un raport de eroare cu informațiile furnizate în „/data/plugins/yarn-error.log”.\n” +
    „Informații Vizitați https://yarnpkg.com/en/docs/cli/add pentru documentația despre această comandă.\n”,
  stderr: „warning package.json: Fără câmp de licență\n” +
    „avertisment Fără licență câmp\n” +
    `eroare A apărut o eroare neașteptată: „EIO: eroare i/o, legătură simbolică „../../../marked/bin/marked” -> „/data/plugins/node_modules/peertube-plugin-chapters/node_modules/ .bin/marked'".\n`
}
eroare Comanda a eșuat cu codul de ieșire 255.

Dar când mă uit în interiorul acelui folder, pot vedea că linkul simbolic a fost creat și funcționează

$: ls -la /data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/
total 12
drwxr-xr-x 1 peertube peertube 3 Mar 29 09:35 .
drwxr-xr-x 1 peertube peertube 3 Mar 29 09:35 ..
lrwxr-xr-x 1 peertube peertube 26 Mar 29 09:35 marcat -> ../../../marked/bin/marked

$: cat /data/plugins/node_modules/peertube-plugin-chapters/node_modules/.bin/marked  
#!/usr/bin/env nod

/**
 * Marcat CLI
 * Drepturi de autor (c) 2011-2013, Christopher Jeffrey (Licență MIT)
 */

const fs = require('fs'),
  cale = necesită('cale'),
  marcat = cere('../');

/**
 * Pagina de manual
 */

function help() {
  const spawn = require('child_process').spawn;

  opțiuni const = {
    cwd: process.cwd(),
    env: process.env,
....

Așa că l-am încercat eu în interiorul containerului creând un fișier, le-am legat simbolic și îl modific

$: echo „Bună ziua” > /data/plugins/hello 
$: cat /data/plugins/hello 
Buna ziua

----

$: ln -s /data/plugins/hello /data/plugins/hello_link
ln: nu s-a putut crea legătura simbolică „/data/plugins/hello_link”: eroare de intrare/ieșire

----

$: cat /data/plugins/hello_link 
Buna ziua

----

$: echo "Lumea" >> /data/plugins/hello_link 

----

$: cat /data/plugins/hello
Buna ziua
Lume

----

$: ls -la /data/plugins/
total 40
drwxr-xr-x 1 peertube peertube 10 Mar 29 09:38 .
drwxr-xr-x 1 peertube peertube 16 Mar 29 06:32 ..
drwxr-xr-x 1 peertube peertube 2 Mar 28 16:48 .DAV
drwxr-xr-x 1 peertube peertube 3 mar 28 16:48 date
-rw-r--r-- 1 peertube peertube 12 mar 29 09:38 salut
lrwxr-xr-x 1 peertube peertube 5 Mar 29 09:38 hello_link -> hello
drwxr-xr-x 1 peertube peertube 6 mar 29 06:35 node_modules
-rw-r--r-- 1 peertube peertube 76 28 mar 16:48 package.json
-rw-r--r-- 1 peertube peertube 1248 29 mar 09:35 yarn-error.log
-rw-r--r-- 1 peertube peertube 413 Mar 28 16:48 yarn.lock

The ln -s comanda aruncă o eroare, dar în rest totul arată bine și funcționează conform așteptărilor.

Ce am încercat

Am incercat sa montez si stocarea cu aceasta optiune

-o follow_symlinks
    urmați legăturile simbolice de pe server 

dar tot ceea ce face a fost spargerea fișierelor și nu le mai puteam șterge, când fișierul țintă a linkului nu mai exista. Deci, am eliminat din nou această opțiune.

Am întrebat serviciul de asistență pentru clienți dacă linkul simbolic este acceptat și răspunsul a fost „da, este acceptat”.

Când creez link-uri simbolice direct pe server, funcționează fără probleme.

Am încercat să montez folderul în interiorul containerului în același folder ca și pe server
/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
 peertube:
    volume:
    - active:/app/client/dist
    - /var/peertube/data:/var/peertube/data
    - /peertube/data/config:/config
    retele:
    - Mod implicit

dar asta nu a ajutat.

Intrebarea

Mi se pare că, de îndată ce montez sshf-urile într-un container docker, nu poate crea nicio legătură simbolică fără acest mesaj de eroare.

Ce trebuie să fac pentru ca acesta să funcționeze în docker?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.