Opis
Używam Dockera w wersji 1.12.5 w systemie Windows 10 przez Hyper-V i chcę używać plików wykonywalnych kontenera jako poleceń w bieżącej ścieżce. Zbudowałem obraz Dockera, który działa poprawnie, ale mam problem z zamontowaniem bieżącej ścieżki. Pomysł polega na utworzeniu aliasu i wykonaniu docker run --rm [...]
polecenia, aby można go było używać w całym systemie w bieżącym katalogu.
Ustawiać
Mam dysk E z folderem „test”, a tam folder o nazwie „folder na hoście systemu Windows”, aby pokazać, że polecenie działa. Dockerfile tworzy katalog /data
, definiuje go jako VOLUME i WORKDIR.
Mając E:\test
jako bieżący katalog w PowerShell i wykonując polecenie Docker ze ścieżką bezwzględną, widzę zawartość E:\test
:
PS E:\test> docker run --rm -it -v E:\test:/data mirkohaaser/docker-clitools ls -la
total 0
drwxr-xr-x 2 root root 0 Jan 4 11:45 .
drwxr-xr-x 2 root root 0 Jan 5 12:17 folder on windows host
Problem
Chcę używać bieżącego katalogu, a nie notacji absolutnej. Nie mogłem użyć pwd w woluminie z powodu różnych komunikatów o błędach:
Próbuję z ($ pwd)
PS E:\test> docker run --rm -it -v ($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: ":/data" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
Próbuję z / ($ pwd)
PS E:\test> docker run --rm -it -v /($pwd):/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error parsing reference: "E:\\test" is not a valid repository/tag.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
Próbuję z \ ´pwd \ ´
PS E:\test> docker run --rm -it -v ´$pwd´:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: Invalid bind mount spec "´E:\\test´:/data": invalid mode: /data.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
Próbuję z „pwd”
PS E:\test> docker run --rm -it -v `$pwd`:/data mirkohaaser/docker-clitools ls -la
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: create $pwd: "$pwd" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
Jaka jest poprawna składnia montowania bieżącego katalogu jako woluminu w Dockerze w systemie Windows 10?
${PWD}
działa również na systemach Unix (Linux, macOS). Uwaga :pwd
= obecny katalog roboczy$(pwd)
który działałby również w systemie Linux (myślę, że - nietestowany)winpty docker run -it -v "/$(pwd -W):/usr/src/project" gcc:4.9
lubwinpty docker run -it -v "/$(cmd //c cd):/usr/src/project" gcc:4.9
.To działa dla mnie w PowerShell:
źródło
PS C:\Users\X\Projects\docker_django> docker run --rm -v ${PWD}:/data alpine ls /data C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: invalid mode: /data. See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.
Docker for Windows
zamiastToolbox
.W przypadku Git Bash dla Windows (w ConEmu) działa dla mnie (dla kontenerów Docker Windows):
Zwróć uwagę na znaki odwrotne / cudzysłowy wokół
pwd -W
!Ze wszystkimi innymi odmianami PWD, które wypróbowałem, otrzymałem:
"Error response from daemon: invalid volume specification: ..."
Aktualizacja: Powyższe dotyczyło kontenerów Docker Windows, do użycia kontenerów Linux:
źródło
pwd -W
: / usr / share / data atomgraph / fuseki --file = / usr / share / data / Mokyklu_sarasas.ttl / mokyklos Nie znaleziono pliku: C: / tools / cmder / vendor /git-for-windows/usr/share/data/Mokyklu_sarasas.ttl`command`
Kliknij Zastosuj . Możesz zostać poproszony o podanie poświadczeń użytkownika.
Poniższe polecenie powinno teraz działać w PowerShell (wiersz polecenia nie obsługuje
${PWD}
):docker run --rm -v ${PWD}:/data alpine ls /data
WAŻNE : jeśli zmienisz hasło do domeny Windows, uchwyt przestanie działać cicho , to znaczy
-v
będzie działał, ale kontener nie będzie widział folderów i plików twojego hosta. Rozwiązanie : wróć do Ustawień, odznacz dyski współdzielone, Zastosuj , zaznacz je ponownie, Zastosuj i wprowadź nowe hasło po wyświetleniu monitu.źródło
Oto moje, które jest kompatybilne zarówno z Win10 docker-ce, jak i Win7 docker-toolbox. W tej chwili to piszę :).
Możesz zauważyć, że wolę używać / host_mnt / c zamiast c: /, ponieważ czasami napotykałem problemy na docker-ce Win 10 z c: /
źródło
${MOUNT_PATH}
rozstrzyga się jako/c/Program Files/Docker Toolbox
Inne rozwiązania dla Git Bash dostarczone przez innych nie działały dla mnie. Najwyraźniej w Git dla Windows jest obecnie błąd / ograniczenie. Zobacz to i to .
W końcu udało mi się go uruchomić po znalezieniu tego wątku GitHub (który zapewnia dodatkowe rozwiązania, jeśli jesteś zainteresowany, które mogą działać dla ciebie, ale nie dla mnie).
Skończyło się na użyciu następującej składni:
Zwróć uwagę na
MSYS_NO_PATHCONV=1
przednią częśćdocker
polecenia i$(pwd)
- nawiasy okrągłe, małe litery pwd, bez cudzysłowów, bez odwrotnych ukośników.Jeśli to ma znaczenie, używam kontenerów Linuksa w systemie Windows.
Przetestowałem to w nowym terminalu Windows, ConEmu i GitBash i wszystkie działały dla mnie.
źródło
MSYS_NO_PATHCONV=1
opcji polecenia? W przeciwnym razie mój docelowy katalog montowania został wypełniony „c: / tools / cmder / vendor / git-for-windows”To polecenie powinno to naprawić.
docker run --rm -it -v
${PWD}:c:\data
mirkohaaser / docker-clitools{PWD} to bieżący folder hosta. po znaku
:
znajduje się folder kontenera. Jeśli montaż jest poprawny, pliki zostaną wyświetlone w dyrektorzec:\data
w kontenerze.źródło
Musisz zamienić wszystkie tylne ukośniki na przednie, więc zmień
docker -v C: \ my \ folder: / mountlocation ...
do
docker -v C: / my / folder: / mountlocation ...
Zwykle wywołuję docker ze skryptu cmd, w którym chcę, aby folder do zamontowania był względem skryptu, który wywołuję, więc w tym skrypcie robię to ...
źródło
Wiersz polecenia (
Cmd.exe
)Gdy interfejs wiersza polecenia platformy Docker jest używany z systemu Windows
Cmd.exe
, użyj%cd%
do zamontowania bieżącego katalogu:Git Bash (MinGW)
Gdy interfejs wiersza poleceń Dockera jest używany z Git Bash (MinGW), montowanie bieżącego katalogu może się nie powieść z powodu konwersji ścieżki POSIX: wolumen zamontowany w Dockerze dodaje; C do ścieżki do końca okna podczas tłumaczenia ze ścieżki stylu linux .
Wyjdź ze ścieżek POSIX, poprzedzając je przedrostkiem
/
Aby pominąć konwersję ścieżki, ścieżki POSIX muszą być poprzedzone ukośnikiem (
/
), aby miały na początku podwójny ukośnik (//
), w tym/$(pwd)
Wyłącz konwersję ścieżki
Wyłącz konwersję ścieżki POSIX w Git Bash (MinGW), ustawiając
MSYS_NO_PATHCONV=1
zmienną środowiskową na poziomie polecenialub poziom powłoki (systemu)
źródło
Git bash
echo ${PWD}
wynik:cmd lub PowerShell
echo ${PWD}
wynik:jak widzimy w cmd lub PowerShell $ {PWD} nie będzie działać
źródło