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:
- Como preciso vincular a pasta main_folder à pasta test_container presente dentro do contêiner do docker?
- Eu preciso fazer isso automaticamente. Como faço para fazer isso sem realmente usar o
run -d -v
comando? - O que acontece se o boot2docker travar? Onde estão armazenados os arquivos do Docker (além do Dockerfile)?
docker
mount
boot2docker
Kishore Vaishnav
fonte
fonte
Respostas:
Existem algumas maneiras de fazer isso. A maneira mais simples de fazer isso é usar o
ADD
comando dockerfile da seguinte maneira: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
.tar
e 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
-v
sinalizador ao usar o docker, da seguinte maneira:fonte
ADD
na verdade não está "montando", ele copia o arquivo para o contêiner que o persiste dentroO 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
mount
vez 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--mount
sintaxe é mais detalhada que-v
ou--volume
, mas a ordem das chaves não é significativa e o valor do sinalizador é mais fácil de entender.O
type
do monte, que pode serbind
,volume
outmpfs
. (Vamos usar o bind )O
source
da montagem. Para montagens de ligação, este é o caminho para o arquivo ou diretório no host do daemon do Docker. Pode ser especificado comosource
ousrc
.A
destination
toma como valor o caminho onde o arquivo ou diretório será montada no recipiente. Pode ser especificado comodestination
,dst
, outarget
.Então, para montar o diretório atual (origem) com
/test_container
(destino), vamos usar: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`
:Você também terá que lidar com a permissão de arquivo, consulte este artigo .
fonte
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:
1) Monte o sistema local em
boot2docker
2) Montar
boot2docker
arquivo no container linuxEntão quando você
ls
dentro docontainerfolder
você verá o conteúdo do seuhostfolder
.fonte
net share
comando 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.mount: unknown filesystem type 'vboxsf'
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.
fonte
docker run -t -i -v /tmp:/tmp ubuntu /bin/bash
onde o host/tmp
será montado no contêiner/tmp
. Agora podetouch /tmp/hello-world
-se do contêiner e ver o arquivo aparecer no host.É possível que você use a janela de encaixe no OS X via
boot2docker
ou 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/host
na verdade, é mapeado a partir daboot2docker
imagem 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).
fonte
[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
/private
prefixo. 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:
Agora compartilhe a pasta no VirtualBox:
Por fim, ssh na docker-machine novamente e monte a pasta que acabamos de compartilhar:
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.
fonte
docker-machine
documento.-v
bandeira?-v
bandeira não funciona como você esperaria no OS X (ou no Windows). O Docker é executado em uma VM, portanto, a pasta referenciada-v
aponta 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./Users
para 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/development
ou outra coisa senão/Users
você vai ter problemas docs.docker.com/engine/userguide/containers/dockervolumesEstou 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:
fonte
No meu sistema, corrigi a resposta do nhjk, ele funciona perfeitamente quando você adiciona a
-t
flag.fonte
Se o host for o Windows 10, em vez de barra, use barra invertida -
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.
fonte
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
fonte
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 prompt do seu Mac, sem montagem duplafonte
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:Então, para testá-lo, você pode fazer
echo TEST > hostTest.txt
dentro da sua imagem. Você poderá ver esse novo arquivo na pasta host local emC:/Users/C/Desktop/dockerStorage/
.fonte
-v $(pwd):/var/xx
primeiro e isso funcionou, mas resultou em um diretório vazio. Estou executando o cyg via babun.Eu estou tendo o mesmo problema. Minha linha de comando ficou assim:
O problema estava com 'pwd'. Então mudei isso para $ (pwd):
fonte
z
?No Docker 18-CE, você pode usar
docker run -v /src/path:/container/path
a 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}:/projectpath
e 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.
fonte
/c/projectpath
mas então recebo o errobind mount source path does not exist: /host_mnt/c/projectpath
.Eu descobri que qualquer diretório sob a diretiva do sistema como
/var
,/usr
,/etc
não poderia ser montar sob o recipiente.A diretiva deve estar no
-v
comutador de espaço do usuário instrui o daemon do docker a montar o diretório local no contêiner, por exemplo:fonte
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
fonte
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.
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).
fonte
Teve o mesmo problema. Encontrei isso na documentação da janela de encaixe :
Portanto, montar um diretório de host de leitura / gravação só é possível com o
-v
parâmetro nodocker run
comando, como as outras respostas apontam corretamente.fonte
Aqui está um exemplo com um caminho do Windows:
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
AutoHotkey
script 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 Key
enquanto 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.
fonte
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-
/data
o ao contêiner.fonte
Observe que no Windows você precisará fornecer o caminho absoluto.
Abaixo funcionou para mim.
fonte
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
fonte
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.
fonte
Você também pode fazer isso com o aplicativo da web Portainer para uma experiência visual diferente.
Primeiro, puxe a imagem do Portainer:
Em seguida, crie um volume para o Portainer:
Crie também um contêiner 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.
PS: Estou usando o Docker 19.035 e o Portainer 1.23.1
fonte