test
je název vašeho obrázku, který jste vytvořili pomocí 'docker build -t test
', nikoli /test
složka.
Zkuste Dockerfile
s:
CMD ["ls", "-lah", "/"]
or
CMD ["cat", "/file.json"]
A:
docker run --rm -it -v $(pwd)/file.json:/file.json test
Všimněte si použití $(pwd)
za účelem připojení souboru s jeho úplnou absolutní cestou (relativní cesty nejsou podporovány)
Pomocí $(pwd)
, získáte absolutní cestu, která existuje, a respektujte velikost písmen, na rozdíl od názvu souboru nebo cesty, která nemusí existovat.
Neexistující cesta hostitele by byla připojena jako složka v kontejneru.
Možná je to z odpovědí výše jasné... ale v mém případě mi nějakou dobu trvalo, než jsem na to přišel.
Základním důvodem, proč se soubor sdílený s -v zobrazuje jako adresář místo souboru, je ten, že Docker nemohl najít soubor na hostiteli. Docker tedy v kontejneru vytvoří nový adresář s názvem názvu neexistujícího souboru na hostiteli, protože si docker myslí, že uživatel chce pouze sdílet svazek/adresář, který bude vytvořen v budoucnu.
Takže ve výše uvedeném problému, pokud jste použili relativní adresář v příkazu -v a docker nerozumí relativním adresářům, znamená to, že soubor nebyl nalezen na hostiteli, a tak docker vytvořil adresář. A výše uvedená odpověď, která navrhuje použít $(pwd), bude správným řešením, když je problém způsoben relativním adresářem.
Ale pro ty, kdo čtou tuto stránku, kteří nepoužívají relativní adresář a mají stejný problém... zkuste pochopit, proč soubor na hostiteli chybí.
Může to být jen hloupý překlep...
Je možné, že spouštíte příkaz „docker run“ z klienta, který vytvoří kontejner dockeru na jiném hostiteli a sdílený soubor na tomto jiném hostiteli neexistuje. Soubor sdílený s -v musí existovat na hostiteli, kde agent docker vytvoří kontejner... ne nutně na klientovi, kde se provádí příkaz "docker run -v ..." (ačkoli budou stejné v mnoho případů).
Výše jsou další možná vysvětlení pro Mac a Windows... to by také mohlo být.
Problém je tedy v tom, že v hostiteli chybí soubor... vyřešte problém ve svém nastavení... řešením může být použití $(pwd), ale ne vždy.