Como montar um diretório host em um contêiner do Docker

618

Estou tentando montar um diretório de host em um contêiner do Docker para que todas as atualizações feitas no host sejam refletidas nos contêineres do Docker.

Onde estou fazendo algo errado. Aqui está o que eu fiz:

kishore$ cat Dockerfile

FROM ubuntu:trusty
RUN apt-get update
RUN apt-get -y install git curl vim
CMD ["/bin/bash"]
WORKDIR /test_container
VOLUME ["/test_container"]

kishore$ tree
.
├── Dockerfile
└── main_folder
    ├── tfile1.txt
    ├── tfile2.txt
    ├── tfile3.txt
    └── tfile4.txt

1 directory, 5 files kishore$ pwd /Users/kishore/tdock

kishore$ docker build --tag=k3_s3:latest .

Uploading context 7.168 kB
Uploading context
Step 0 : FROM ubuntu:trusty
 ---> 99ec81b80c55
Step 1 : RUN apt-get update
 ---> Using cache
 ---> 1c7282005040
Step 2 : RUN apt-get -y install git curl vim
 ---> Using cache
 ---> aed48634e300
Step 3 : CMD ["/bin/bash"]
 ---> Running in d081b576878d
 ---> 65db8df48595
Step 4 : WORKDIR /test_container
 ---> Running in 5b8d2ccd719d
 ---> 250369b30e1f
Step 5 : VOLUME ["/test_container"]
 ---> Running in 72ca332d9809
 ---> 163deb2b1bc5
Successfully built 163deb2b1bc5
Removing intermediate container b8bfcb071441
Removing intermediate container d081b576878d
Removing intermediate container 5b8d2ccd719d
Removing intermediate container 72ca332d9809

kishore$ docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

kishore$ docker run -i -t k3_s3:latest /bin/bash

root@0f17e2313a46:/test_container# ls -al
total 8
drwx------  2 root root 4096 Apr 29 05:15 .
drwxr-xr-x 66 root root 4096 Apr 29 05:15 ..

root@0f17e2313a46:/test_container# exit exit

kishore$ docker -v
Docker version 0.9.1, build 867b2a9

  • Não sei como verificar a versão do boot2docker

Perguntas, problemas enfrentados:

  1. Como preciso vincular a pasta main_folder à pasta test_container presente dentro do contêiner do docker?
  2. Eu preciso fazer isso automaticamente. Como faço para fazer isso sem realmente usar o run -d -vcomando?
  3. O que acontece se o boot2docker travar? Onde estão armazenados os arquivos do Docker (além do Dockerfile)?
Kishore Vaishnav
fonte
2
Para sua informação, isso parece estar corrigido no docker a partir deste comentário. Estou usando o boot2docker no meu mac. Eu posso usar a opção -v e meu diretório local é montado todo o caminho no contêiner.
Marco

Respostas:

509

Existem algumas maneiras de fazer isso. A maneira mais simples de fazer isso é usar o ADDcomando dockerfile da seguinte maneira:

ADD . /path/inside/docker/container

No entanto, quaisquer alterações feitas neste diretório no host após a construção do arquivo docker não serão exibidas no contêiner. Isso ocorre ao criar um contêiner, a janela de encaixe compacta o diretório em um .tare carrega esse contexto no contêiner permanentemente.

A segunda maneira de fazer isso é a maneira que você tentou, que é montar um volume. Por tentar ser o mais portátil possível, não é possível mapear um diretório host para um diretório de contêiner de docker dentro de um arquivo docker, porque o diretório de host pode mudar dependendo da máquina em que você está executando. Para mapear um diretório host para um diretório de contêiner de docker, você precisa usar o -vsinalizador ao usar o docker, da seguinte maneira:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run
nhjk
fonte
Tentei assim kishore $ docker -v / Usuários / kishore / main_folder: / test_container Docker versão 0.9.1, compilação 867b2a9 kishore $ docker run -v / Usuários / kishore / main_folder: / test_container Uso: docker run [OPTIONS] IMAGE [ COMMAND] [ARG ...] Execute um comando em um novo contêiner -P, --publish-all = false: publique todas as portas expostas nas interfaces do host -a, --attach = []: anexe ao stdin, stdout ou stderr. -c, --cpu-shares = 0: compartilhamentos de CPU (peso relativo)
Kishore Vaishnav
2
você pode ter ambos ADD. e -v volume montado ao mesmo tempo. usando app_dir padrão se não especificar uma montagem de host?
alexzg
@alexzg Eu não acho que podemos ter apenas o primeiro a ter precedência. Além disso, não estou claro sobre seu app_dir padrão de segundo ponto ... montagem do host ..?
Kishore Vaishnav
35
Isso funcionou para mim no mac os x com docker-machine e VirtualBox. Uma ressalva que descobri por tentativa e erro é que o diretório host deve ser um caminho completo e não um caminho relativo.
precisa saber é o seguinte
25
ADDna verdade não está "montando", ele copia o arquivo para o contêiner que o persiste dentro
Kev
200

O usuário desta pergunta estava usando Docker version 0.9.1, build 867b2a9, darei uma resposta para a versão do docker> = 17.06.

O que você quer, manter diretório local sincronizado dentro do diretório recipiente, é realizado por montar o volume com o tipo bind. Isso vinculará os diretórios de origem (seu sistema) e de destino (no contêiner do docker). É quase o mesmo que montar um diretório no linux.

De acordo com a documentação do Docker , o comando apropriado para montar agora é em mountvez de -v. Aqui está a documentação:

  • --mount: Consiste em vários pares de valores-chave, separados por vírgulas. Cada par de chave / valor assume a forma de uma <key>=<value>tupla. A --mountsintaxe é mais detalhada que -vou --volume, mas a ordem das chaves não é significativa e o valor do sinalizador é mais fácil de entender.

  • O typedo monte, que pode ser bind, volumeou tmpfs. (Vamos usar o bind )

  • O sourceda montagem. Para montagens de ligação, este é o caminho para o arquivo ou diretório no host do daemon do Docker. Pode ser especificado como sourceou src.

  • A destinationtoma como valor o caminho onde o arquivo ou diretório será montada no recipiente. Pode ser especificado como destination, dst, ou target.

Então, para montar o diretório atual (origem) com /test_container(destino), vamos usar:

    docker run -it --mount src="$(pwd)",target=/test_container,type=bind k3_s3

Se esses parâmetros de montagem tiverem espaços, você deverá colocar aspas em torno deles. Quando eu sei que não, eu usaria `pwd`:

    docker run -it --mount src=`pwd`,target=/test_container,type=bind k3_s3

Você também terá que lidar com a permissão de arquivo, consulte este artigo .

Eduardo Santana
fonte
2
Eu upvoted sua resposta, porque eu amo como concisa que é e não é errado, mas você pode querer atualizá-lo um pouco à luz de minha resposta à stackoverflow.com/a/51829247/901899
rainabba
2
Eu acho que a documentação foi atualizada desde esta resposta, pois agora parece recomendar volumes, em vez de montagens. Vale a pena ir embora, antes de se comprometer com qualquer coisa.
Sipty 13/08/19
1
@Sipty pode estar se referindo ao seguinte: " Se você estiver desenvolvendo novos aplicativos Docker, considere o uso de volumes nomeados . Não é possível usar os comandos da CLI do Docker para gerenciar diretamente as montagens de ligação. "
Aluthren
81

2 montagens sucessivas: Eu acho que muitas postagens aqui podem estar usando dois boot2docker, a razão pela qual você não vê nada é porque está montando um diretório a partir do boot2docker, não do seu host.

Você basicamente precisa de 2 montagens sucessivas:

o primeiro a montar um diretório do host para o sistema

o segundo a montar o novo diretório do boot2docker no seu contêiner assim:

  • 1) Monte o sistema local em boot2docker

    sudo mount -t vboxsf hostfolder /boot2dockerfolder
    
  • 2) Montar boot2dockerarquivo no container linux

    docker run -v /boot2dockerfolder:/root/containerfolder -i -t imagename
    

Então quando você lsdentro do containerfoldervocê verá o conteúdo do seu hostfolder.

Louis V
fonte
1
Melhor resposta. Eu tenho que acrescentar que (no Windows) a pasta do host no comando mount está se referindo a um nome de compartilhamento de pasta. Aquele que aparece com um net sharecomando dentro de um terminal do Windows (cmd). E você deve adicionar essa como uma pasta compartilhada com a GUI do VirtualBox (usando o mesmo nome se você seguir minha lógica). Se você omitir o compartilhamento, ele funcionará, mas você terá problemas com permissões e atualizações de desempenho.
precisa saber é o seguinte
como o comando mount conhece o host onde está / boot2dockerfolder?
Alfonsodev
Eu recebi o erro mount: unknown filesystem type 'vboxsf'
:,
"vboxsf" é o driver do "sistema de arquivos" da pasta compartilhada do VirtualBox. Ele deve ser configurado na VM instalando as extensões do VirtualBox. A imagem boot2docker não deve ter essas instaladas. O VirtualBox possui uma função "dispositivo" para "inserir" as imagens ISO do VirtualBox Additions como um volume virtual. Normalmente, você pode montar isso no mount usando mount / dev / cdrom / mnt, entrando em / mnt e executando o bash VBoxLinuxAdditions. Pode ser necessário instalar o gcc, kernel ou outras dependências.
Andrew Wolfe
mount.vboxsf: falha na montagem com o erro: Nenhum arquivo ou diretório é exibido: montagem mymapfoldername em / boot2dockerfolder falhou: não existe arquivo ou diretório
vee
71

você pode usar a opção -v do cli, esse recurso não está disponível via Dockerfile

docker run -t -i -v <host_dir>:<container_dir> ubuntu /bin/bash

onde host_dir é o diretório do host que você deseja montar. você não precisa se preocupar com o diretório do contêiner, se ele não existir, o docker o criará.

Se você fizer alguma alteração no host_dir da máquina host (sob privilégios de root), ela ficará visível para o contêiner e vice-versa.

rgaut
fonte
6
Que exemplo agradável, limpo e direto ao ponto para ilustrar a opção de montagem do host. Talvez pudesse ser melhorado usando o diretório real: docker run -t -i -v /tmp:/tmp ubuntu /bin/bashonde o host /tmpserá montado no contêiner /tmp. Agora pode touch /tmp/hello-world-se do contêiner e ver o arquivo aparecer no host.
Stephan Henningsen 30/01
3
Funciona perfeito. Mas montar dessa maneira define o proprietário do diretório como raiz e isso também espera que o contêiner seja executado como raiz. Como montamos o dir como não raiz quando o contêiner é executado como não raiz?
Arun
33

É possível que você use a janela de encaixe no OS X via boot2dockerou algo semelhante.

Fiz a mesma experiência - o comando está correto, mas nada (sensato) está montado no contêiner.

Como se vê - já está explicado na documentação do docker . Quando você digita docker run -v /var/logs/on/host:/var/logs/in/container ..., /var/logs/on/hostna verdade, é mapeado a partir da boot2dockerimagem da VM, não do seu Mac.

Você precisará canalizar a pasta compartilhada através da sua VM para o host real (o Mac no meu caso).

user3680997
fonte
1
Obrigado! Isso me ajudou com um problema distante. Postgres rodando dentro Docker tinha vinculado ao IP VBox, não o localhost, como ele teria se não em execução no OS X.
Peter Becich
2
Esse URL para a documentação do docker não é mais válido
digitaldavenyc
haha a melhor piada de todos os tempos .. eles realmente poderiam ter dado uma dica ou algo assim.
precisa saber é o seguinte
2
O link para sua documentação é um 404
Factor Mystic
3
Estou curioso para ver um exemplo de canalizar a pasta compartilhada através da VM para o host real.
Derek
28

[ATUALIZAÇÃO] A partir de junho de 2017, o Docker for Mac cuida de todas as partes irritantes disso em que você precisa mexer no VirtualBox. Permite mapear basicamente tudo em seu host local usando o /privateprefixo. Mais informações aqui . [/ATUALIZAR]

Todas as respostas atuais falam sobre Boot2docker. Como agora está obsoleto em favor da docker-machine, isso funciona para a docker-machine:

Primeiro, faça o ssh na docker-machine vm e crie a pasta para a qual iremos mapear:

docker-machine ssh $MACHINE_NAME "sudo mkdir -p \"$VOL_DIR\""

Agora compartilhe a pasta no VirtualBox:

WORKDIR=$(basename "$VOL_DIR")
vboxmanage sharedfolder add "$MACHINE_NAME" --name "$WORKDIR" --hostpath "$VOL_DIR" --transient

Por fim, ssh na docker-machine novamente e monte a pasta que acabamos de compartilhar:

docker-machine ssh $MACHINE_NAME "sudo mount -t vboxsf -o uid=\"$U\",gid=\"$G\" \"$WORKDIR\" \"$VOL_DIR\""

Nota: para UID e GID, você pode basicamente usar quaisquer números inteiros, desde que eles ainda não sejam utilizados.

Isso é testado no docker-machine 0.4.1 e no docker 1.8.3 no OS X El Capitan.

Eli
fonte
1
+1. Depois de várias horas batendo minha cabeça, sua resposta funcionou. Isso deve fazer parte do docker-machinedocumento.
Abhijit Sarkar 27/11
Por que não usar a -vbandeira?
Igracia 13/05
1
@igracia a -vbandeira não funciona como você esperaria no OS X (ou no Windows). O Docker é executado em uma VM, portanto, a pasta referenciada -vaponta para uma pasta na VM, não no SO raiz. Essa técnica dá o próximo passo no mapeamento da pasta da VM de volta ao SO raiz.
Patrick Gunderson
1
@PatrickGunderson No meu caso (OS X), a pasta está no host, não na VM, e funciona bem. As portagens do Docker cuidam de exportá-lo para a VM e de lá para o contêiner.
Igracia 20/05
1
A única exceção à regra que mencionei é que a VM será montada automaticamente /Userspara compartilhamento no docker. Isso significa que, se seus arquivos de trabalho estiverem ~/*, você estará pronto. Se você tem sua configuração do ambiente dev ficar sem /developmentou outra coisa senão /Usersvocê vai ter problemas docs.docker.com/engine/userguide/containers/dockervolumes
Patrick Gunderson
27

Estou apenas tentando fazer com que meu aplicativo SailsJS seja executado dentro de um contêiner do Docker para manter minha máquina física limpa.

Estou usando o seguinte comando para montar meu aplicativo SailsJS / NodeJS em / app:

cd my_source_code_folder
docker executado -it -p 1337: 1337 -v $ (pwd): / app my_docker / image_with_nodejs_etc
Sven
fonte
5
Como isso pode ser feito no Dockerfile?
orad
23
docker run -v /host/directory:/container/directory -t IMAGE-NAME /bin/bash

docker run -v /root/shareData:/home/shareData -t kylemanna/openvpn /bin/bash

No meu sistema, corrigi a resposta do nhjk, ele funciona perfeitamente quando você adiciona a -tflag.

Todos
fonte
Você é capaz de criar / atualizar arquivos do FS local e ver as alterações no contêiner do docker?
Avi Mehenwal 22/09/19
14

Se o host for o Windows 10, em vez de barra, use barra invertida -

docker run -it -p 12001:80 -v c:\Users\C\Desktop\dockerStorage:/root/sketches

Verifique se a unidade host está compartilhada (C neste caso). No meu caso, recebi um prompt solicitando permissão de compartilhamento após executar o comando acima.

Duke79
fonte
13

No Mac OS, para montar uma pasta /Users/<name>/projects/no seu Mac na raiz do seu contêiner:

docker run -it -v /Users/<name>/projects/:/projects <container_name> bash

ls /projects

Bormat
fonte
11

Atualização de julho de 2015 - o boot2docker agora suporta montagem direta. Você pode usar -v /var/logs/on/host:/var/logs/in/containerdiretamente do prompt do seu Mac, sem montagem dupla

Tal
fonte
11

Para usuários do Windows 10 , é importante ter o ponto de montagem dentro do C:/Users/diretório. Eu tentei por horas para fazer isso funcionar. Esta postagem ajudou, mas não foi óbvia a princípio, pois a solução para o Windows 10 é um comentário a uma resposta aceita. Foi assim que eu fiz:

docker run -it -p 12001:80 -v //c/Users/C/Desktop/dockerStorage:/root/sketches \
<your-image-here> /bin/bash

Então, para testá-lo, você pode fazer echo TEST > hostTest.txtdentro da sua imagem. Você poderá ver esse novo arquivo na pasta host local em C:/Users/C/Desktop/dockerStorage/.

KF
fonte
As barras duplas no caminho foram o que fizeram funcionar para mim. Foi confuso porque usei -v $(pwd):/var/xxprimeiro e isso funcionou, mas resultou em um diretório vazio. Estou executando o cyg via babun.
kenchilada
Tive o mesmo problema no Windows 7 ao usar / c / data /, movendo o diretório do host em / c / Users / <user> / resolvi-o para mim. Obrigado.
precisa saber é o seguinte
1
podemos ter um link para a postagem que o ajudou a resolver o problema?
PBo 26/03/19
11

Eu estou tendo o mesmo problema. Minha linha de comando ficou assim:

docker run --rm -i --name $NAME -v `pwd`:/sources:z $NAME

O problema estava com 'pwd'. Então mudei isso para $ (pwd):

docker run --rm -i --name $NAME -v $(pwd):/sources:z $NAME
NikitQa
fonte
1
Para que serve z?
hhh
2
A opção z indica que o conteúdo da montagem de ligação é compartilhado entre vários contêineres.
Jason
10

No Docker 18-CE, você pode usar docker run -v /src/path:/container/patha vinculação bidirecional de uma pasta host.

Há um problema importante aqui, se você estiver trabalhando com o Windows 10 / WSL e tiver o Docker-CE for Windows como seu host e as ferramentas do cliente docker-ce no WSL. A WSL conhece todo o sistema de arquivos / enquanto o host do Windows conhece apenas suas unidades. Dentro da WSL, você pode usar / mnt / c / projectpath, mas se tentar docker run -v ${PWD}:/projectpath, encontrará no host que / projectpath / está vazio porque no host / mnt não significa nada.

Se você trabalha em / c / projectpath e, em seguida, o faz docker run -v ${PWD}:/projectpathe você descobrirá que no contêiner, / projectpath refletirá / c / projectpath em tempo real. Não há erros ou outras formas de detectar esse problema além de ver montagens vazias dentro do seu convidado.

Você também deve certificar-se de "compartilhar a unidade" nas configurações do Docker for Windows.

rainabba
fonte
Estou tendo esse problema com o Win10 / WSL e o Docker-CE / docker-ce. Vazio / caminho do projeto /. O que você quer dizer com "trabalhar em / c / projectpath"? Eu tentei vincular / c / a / mnt / ce executar a partir de, /c/projectpathmas então recebo o erro bind mount source path does not exist: /host_mnt/c/projectpath.
Steven T. Snyder
Esta ligação resolveu o meu problema: support.divio.com/local-development/docker/... (Docker apenas no Windows permite a montagem de / Users / por padrão)
Steven T. Snyder
7

Eu descobri que qualquer diretório sob a diretiva do sistema como /var,/usr , /etcnão poderia ser montar sob o recipiente.

A diretiva deve estar no -vcomutador de espaço do usuário instrui o daemon do docker a montar o diretório local no contêiner, por exemplo:

docker run -t -d -v /{local}/{path}:/{container}/{path} --name {container_name} {imagename}
Mansur Ali
fonte
5

boot2docker junto com o VirtualBox Guest Additions
Como montar / Usuários no boot2docker

https://medium.com/boot2docker-lightweight-linux-for-docker/boot2docker-together-with-virtualbox-guest-additions-da1e3ab2465c

tl; dr Crie seu próprio boot2docker.iso personalizado com o VirtualBox Guest Additions (consulte o link ) ou faça o download http://static.dockerfiles.io/boot2docker-v1.0.1-virtualbox-guest-additions-v4.3.12.iso e salve-o para ~ / .boot2docker / boot2docker.iso.

fosco
fonte
Tentei usar esse iso e ainda enfrentei os mesmos problemas ... Usar as instruções descritas nessa postagem me ajudou a resolver o problema - eu basicamente tive que forçar a pasta compartilhada.
Jaco Pretorius
Eu usei o iso, tropeçou em não ter parado a VM do Virtual Box antes de chamar o cmd 'VBoxManage sharedfolder add ...'. Finalmente consegui tudo funcionando, embora muito obrigado.
Emile
Nota: a razão pela qual o -v arg não funciona através do boot2docker é, aparentemente, algo a ver com a montagem no boot2docker-vm e não no seu host real. é por isso que acho que a parte do Vboxmanage ajuda a funcionar.
Emile
5

Como vincular a pasta main_folder à pasta test_container presente dentro do contêiner do docker?

Seu comando abaixo está correto, a menos que você esteja em um Mac usando o boot2docker (dependendo de futuras atualizações); nesse caso, você poderá encontrar a pasta vazia. Veja a resposta mate para um tutorial sobre como corrigir isso.

docker run -d -v /Users/kishore/main_folder:/test_container k3_s3:latest

Eu preciso fazer isso rodar automaticamente, como fazer isso sem realmente usar o comando run -d -v.

Você realmente não pode deixar de usar esses comandos, eles são intrínsecos à maneira como o docker funciona. É melhor colocá-los em um script de shell para poupar a escrevê-los repetidamente.

O que acontece se o boot2docker falhar? Onde estão armazenados os arquivos da janela de encaixe?

Se você conseguir usar o -v arg e referenciar sua máquina host, os arquivos estarão seguros em seu host.

Se você usou 'docker build -t myimage'. com um arquivo Docker, seus arquivos serão inseridos na imagem.

Suas imagens do docker, acredito, são armazenadas no boot2docker-vm. Descobri isso quando minhas imagens desapareceram quando eu excluo o vm do VirtualBox. (Observe que eu não sei como o Virtualbox funciona, portanto as imagens ainda podem estar ocultas em outro lugar, mas não visíveis para o docker).

Emile
fonte
5

Teve o mesmo problema. Encontrei isso na documentação da janela de encaixe :

Nota: O diretório do host é, por natureza, dependente do host. Por esse motivo, você não pode montar um diretório de host do Dockerfile, a instrução VOLUME não suporta a passagem de um diretório de host, porque as imagens criadas devem ser portáteis. Um diretório de host não estaria disponível em todos os hosts em potencial.

Portanto, montar um diretório de host de leitura / gravação só é possível com o -vparâmetro no docker runcomando, como as outras respostas apontam corretamente.

matthaeus
fonte
O que é exatamente o diretório host?
Nicolas S.Xu
@ NicolasS.Xu Qualquer caminho na máquina host do docker real.
J. Scott Elblein
5

Aqui está um exemplo com um caminho do Windows:

docker run -P -it --name organizr --mount src="/c/Users/MyUserName/AppData/Roaming/DockerConfigs/Organizr",dst=/config,type=bind organizrtools/organizr-v2:latest

Como observação lateral, durante todo esse puxão de cabelo, tendo que lutar para descobrir e redigitar os caminhos repetidamente, decidi criar um pequeno AutoHotkeyscript para converter um caminho do Windows em um caminho formatado "Docker Windows " . Dessa forma, tudo o que preciso fazer é copiar qualquer caminho do Windows que eu queira usar como ponto de montagem para a área de transferência, pressionar a tecla "Aplicativos" no teclado e formatá-lo em um formato de caminho que o Docker aprecia.

Por exemplo:

Copie isso para a sua área de transferência:

C:\Users\My PC\AppData\Roaming\DockerConfigs\Organizr

pressione Apps Keyenquanto o cursor estiver onde você deseja na linha de comando, e ele será colado aqui:

"/c/Users/My PC/AppData/Roaming/DockerConfigs/Organizr"

Economiza muito tempo para mim. Aqui é para qualquer pessoa que possa achar útil.

; --------------------------------------------------------------------------------------------------------------
;
; Docker Utility: Convert a Windows Formatted Path to a Docker Formatter Path
;                   Useful for (example) when mounting Windows volumes via the command-line.
;
; By:       J. Scott Elblein
; Version:  1.0
; Date:     2/5/2019
;
; Usage:    Cut or Copy the Windows formatted path to the clipboard, press the AppsKey on your keyboard
;           (usually right next to the Windows Key), it'll format it into a 'docker path' and enter it
;           into the active window. Easy example usage would be to copy your intended volume path via
;           Explorer, place the cursor after the "-v" in your Docker command, press the Apps Key and
;           then it'll place the formatted path onto the line for you.
;
; TODO::    I may or may not add anything to this depending on needs. Some ideas are:
;           
;           - Add a tray menu with the ability to do some things, like just replace the unformatted path
;               on the clipboard with the formatted one rather than enter it automatically.
;           - Add 'smarter' handling so the it first confirms that the clipboard text is even a path in
;               the first place. (would need to be able to handle Win + Mac + Linux)
;           - Add command-line handling so the script doesn't need to always be in the tray, you could
;               just pass the Windows path to the script, have it format it, then paste and close.
;               Also, could have it just check for a path on the clipboard upon script startup, if found
;               do it's job, then exit the script.
;           - Add an 'all-in-one' action, to copy the selected Windows path, and then output the result.
;           - Whatever else comes to mind.
;
; --------------------------------------------------------------------------------------------------------------

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%

AppsKey::

    ; Create a new var, store the current clipboard contents (should be a Windows path)
    NewStr := Clipboard

    ; Rip out the first 2 chars (should be a drive letter and colon) & convert the letter to lowercase
    ; NOTE: I could probably replace the following 3 lines with a regexreplace, but atm I'm lazy and in a rush.
    tmpVar := SubStr(NewStr, 1, 2)
    StringLower, tmpVar, tmpVar

    ; Replace the uppercase drive letter and colon with the lowercase drive letter and colon
    NewStr := StrReplace(NewStr, SubStr(NewStr, 1, 2), tmpVar)

    ; Replace backslashes with forward slashes
    NewStr := StrReplace(NewStr,  "\", "/")

    ; Replace all colons with nothing
    NewStr := StrReplace(NewStr, ":", "")

    ; Remove the last char if it's a trailing forward slash
    NewStr :=  RegExReplace(NewStr, "/$")

    ; Append a leading forward slash if not already there
    if RegExMatch(NewStr, "^/") == 0
        NewStr :=  "/" . NewStr

    ; If there are any spaces in the path ... wrap in double quotes
    if RegExMatch(NewStr, " ") > 0
        NewStr :=  """" . NewStr . """"

    ; Send the result to the active window
    SendInput % NewStr 
J. Scott Elblein
fonte
4

Para fazer isso funcionar no Windows 10 , tive que abrir a janela Configurações do Docker na bandeja do sistema e ir para a seção Unidades compartilhadas .

Marquei a caixa ao lado de C. O Docker solicitou minhas credenciais da área de trabalho para obter autorização para gravar na minha pasta Usuários.

Em seguida, executei o contêiner do docker seguindo os exemplos acima e também o exemplo nessa página de configurações, anexando- /datao ao contêiner.

docker run -v c:/Users/<user.name>/Desktop/dockerStorage:/data -other -options
Adam Smith
fonte
3

Observe que no Windows você precisará fornecer o caminho absoluto.

Abaixo funcionou para mim.

docker run -t -i -v D:/projects/:/home/chankeypathak/work -p 8888:8888 jupyter/tensorflow-notebook /bin/bash
Chankey Pathak
fonte
3

Eu tive os mesmos problemas, estava tentando montar a pasta C: \ Users \ na janela de encaixe,
é assim que eu fiz isso Linha de comando do Docker Toolbox

 $ docker run -it --name <containername> -v /c/Users:/myVolData <imagename>
Abhishek DK
fonte
2

Eu tinha o mesmo requisito para montar o diretório host do contêiner e usei o comando de montagem de volume. Mas durante o teste, notei que ele também está criando arquivos dentro do contêiner, mas depois de algumas escavações, descobrimos que são apenas links simbólicos e o sistema de arquivos real usado na máquina host.

Sunil Chauraha
fonte
2

Você também pode fazer isso com o aplicativo da web Portainer para uma experiência visual diferente.

Primeiro, puxe a imagem do Portainer:

docker pull portainer/portainer

Em seguida, crie um volume para o Portainer:

docker volume create portainer_data

Crie também um contêiner Portainer:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

Você poderá acessar o aplicativo Web com seu navegador neste URL: " http: // localhost: 9000 ". No primeiro login, você será solicitado a definir suas credenciais de administrador do Portainer.

No aplicativo Web, siga estes menus e botões: (Contêiner> Adicionar contêiner> Configurações de preenchimento > Implementar contêiner)

Eu tive problemas para criar um volume "mount" com o Portainer e percebi que tinha que clicar em "bind" ao criar o volume do meu contêiner. Abaixo está uma ilustração das configurações de ligação de volume que funcionaram para a criação do meu contêiner com um volume montado ligado ao host.

configurações de ligação de volume

PS: Estou usando o Docker 19.035 e o Portainer 1.23.1

Michael Fayad
fonte