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




run docker container port (14)

É possível que você use a janela de encaixe no OS X via boot2docker ou algo similar.

Eu fiz a mesma experiência - o comando está correto, mas nada (sensato) é montado no contêiner, de qualquer maneira.

Acontece que isso já está explicado na documentação do docker . Quando você digita o docker run -v /var/logs/on/host:/var/logs/in/container ... e /var/logs/on/host é realmente mapeado a partir da boot2docker VM boot2docker , não do seu Mac.

Você terá que canalizar a pasta compartilhada através de sua VM para o seu host real (o Mac no meu caso).

Eu estou tentando montar um diretório de host em um contêiner do Docker para que quaisquer atualizações feitas no host sejam refletidas nos contêineres do Docker. Não consegui ter sucesso depois de pesquisar e ler os links de volume 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 / Usuários / kishore / main_folder: / test_container k3_s3: latest c9f9a7e09c54ee1c2cc966f15c963b4af320b5203b8c46689033c1ab8872a0ea

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

[email protected]:/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 Saída

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

  • Eu não sei como verificar a versão do boot2docker

Perguntas, problemas enfrentados:

  1. Como eu preciso vincular a pasta_principal à pasta test_container presente dentro do contêiner docker?
  2. Eu preciso fazer isso automaticamente. Como faço para fazer isso sem realmente usar o comando run -d -v ?
  3. O que acontece se o boot2docker travar? Onde estão os arquivos do Docker armazenados (exceto o Dockerfile)?

2 montagens sucessivas: Eu acho que muitos posts aqui podem estar usando dois boot2docker, o motivo pelo qual você não vê nada é porque você está montando um diretório do boot2docker não do seu host.

Você basicamente precisa de 2 montagens sucessivas: a primeira para montar um diretório do seu host para o seu sistema e a segunda para montar o novo diretório do boot2docker para o seu contêiner da seguinte forma:

1. montar o sistema local no boot2docker

sudo mount -t vboxsf hostfolder /boot2dockerfolder

2. monte o arquivo boot2docker no container linux

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

Então, quando você estiver dentro da pasta contêiner, você verá o conteúdo da sua hostfolder.


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


Descobri que qualquer diretório colocado sob a diretiva do sistema, como /var , /usr , /etc não pode ser montado sob o contêiner.

A diretiva deve estar no espaço do usuário -v switch 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}

Eu tenho tido o mesmo problema. Minha linha de comando ficou assim:

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

O problema foi com 'pwd'. Então eu mudei para $ (pwd):

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

Eu tinha o mesmo requisito para montar o diretório host do container e usei o comando mount mount. Mas durante os testes notamos que ele está criando arquivos dentro do container também, mas depois de alguns descobrimentos descobrimos que eles são apenas links simbólicos e o sistema de arquivos real usado na máquina host do formulário.


Existem algumas maneiras de fazer isso. A maneira mais simples de fazer isso é usar o comando dockerfile ADD forma:

ADD . /path/inside/docker/container

No entanto, quaisquer alterações feitas nesse diretório no host após a criação do dockerfile não serão exibidas no contêiner. Isso ocorre porque, ao criar um contêiner, o docker compacta o diretório em um .tar e faz o upload desse contexto no contêiner permanentemente.

A segunda maneira de fazer isso é a maneira como você tentou, que é montar um volume. Devido a tentar ser o mais portável possível, você não pode mapear um diretório de host para um diretório de contêiner do Docker dentro de um dockerfile, porque o diretório do host pode mudar dependendo de qual máquina você está executando. Para mapear um diretório de host para um diretório de contêiner do docker, é necessário usar o sinalizador -v ao usar o docker como:

docker run -v /host/directory:/container/directory -other -options image_name command_to_run

Note que no Windows você terá que fornecer o caminho absoluto.

Abaixo trabalhei para mim.

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

Para usuários do Windows 10 , é importante ter o ponto de montagem dentro do diretório C:/Users/ . Eu tentei por horas para fazer isso funcionar. Este post ajudou, mas inicialmente não era óbvio, já que a solução para o Windows 10 é um comentário para 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

Em seguida, para testá-lo, você pode fazer o echo TEST > hostTest.txt dentro de sua imagem. Você deve conseguir ver esse novo arquivo na pasta do host local em C:/Users/C/Desktop/dockerStorage/ .


Tive o mesmo problema. Encontrei isso na documentação do docker :

Nota: O diretório do host é, por sua 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, a montagem de um diretório de host de leitura / gravação só é possível com o parâmetro -v no comando docker run , conforme as outras respostas apontam corretamente.


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 uma nota lateral, durante todo esse puxão de cabelo, tendo que lutar para descobrir e redigitar caminhos repetidas vezes, decidi criar um pequeno script AutoHotkey para converter um caminho do Windows em um "Docker Windows " formatado caminho. Dessa forma, tudo o que preciso fazer é copiar qualquer caminho do Windows que eu queira usar como um ponto de montagem para a área de transferência, pressionar a tecla "Aplicativos" no teclado e formatá-la em um formato de caminho que o Docker aprecie.

Por exemplo:

Copie isso para sua área de transferência:

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

pressione a Apps Key enquanto o cursor estiver onde você quiser na linha de comando, e ele colará isso aí:

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

Poupa muito tempo para mim. Aqui está para qualquer outra 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 

Como faço para vincular a pasta_principal à pasta test_container presente dentro do contêiner docker?

Seu comando abaixo está correto, a menos que o seu em um mac usando boot2docker (dependendo de futuras atualizações), caso em que você pode encontrar a pasta vazia. Veja resposta mattes para um tutorial sobre como corrigir isso.

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

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

Você não pode deixar de usar esses comandos, eles são intrínsecos à maneira como o docker funciona. Seria melhor colocá-los em um shell script para evitar que você os anotasse repetidamente.

O que acontece se o boot2docker travar? Onde os arquivos do docker são armazenados?

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

Se você já usou 'docker build -t myimage.' com um Dockerfile, seus arquivos serão colocados na imagem.

Suas imagens docker, creio eu, são armazenadas no boot2docker-vm. Eu descobri isso quando minhas imagens desapareceram quando eu excluir o vm do VirtualBox. (Note, eu não sei como o Virtualbox funciona, então as imagens podem ainda estar escondidas em outro lugar, apenas não visíveis para o docker).



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 eu corrigi a resposta do nhjk, ele funciona sem falhas quando você adiciona o sinalizador -t .





boot2docker