Qual é o propósito de VOLUME no Dockerfile

106

Estou tentando aprofundar minha compreensão do volume do Docker e estou tendo dificuldade em descobrir as diferenças / caso de uso de:

  • O docker volume createcomando
  • o docker run -v /path:/host_path
  • A VOLUMEentrada no Dockerfilearquivo

Eu particularmente não entendo o que acontece se você combinar a VOLUMEentrada com a -vbandeira.

rádio 226
fonte
1
relacionado: stackoverflow.com/a/46992367/3160529
Shubham

Respostas:

70

Um volume é um dado persistente armazenado em /var/lib/docker/volumes/...

  • Você pode declará-lo em um Dockerfile, o que significa que cada vez que um contêiner é iniciado a partir da imagem, o volume é criado ( vazio ), mesmo se você não tiver nenhuma -vopção.

  • Você pode declará-lo em tempo de execução docker run -v [host-dir:]container-dir.
    combinar os dois ( VOLUME+ docker run -v) significa que você pode montar o conteúdo de uma pasta de host em seu volume persistido pelo contêiner em/var/lib/docker/volumes/...

  • docker volume create cria um volume sem ter que definir um Dockerfile e construir uma imagem e executar um contêiner. É usado para permitir que outros contêineres montem esse volume rapidamente.

Se você persistiu algum conteúdo em um volume, mas desde então excluiu o contêiner (que por padrão não exclui seu volume associado, a menos que esteja usando docker rm -v), você pode anexar novamente esse volume a um novo contêiner (declarando o mesmo volume).

Consulte " Docker - Como acessar um volume não conectado a um contêiner? ".
Com a criação de volume do docker, é fácil reanexar um volume nomeado a um contêiner.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!
VonC
fonte
2
Digamos que você use um Dockerfilewith VOLUMEe a -v /path:/host_path/bandeira. O conteúdo de VOLUMEserá substituído pelo conteúdo de /host_path/?
radium226 de
Graças a você @VonC, acho que entendi :) E se você fizer a docker volume create --name my_volumeseguido por a docker run --volume-from my_volume, como saberá onde estará o ponto de montagem?
radium226 de
@ radium226 sem ponto de montagem (significando nada montado do host, além do / var / lib / docker / volume nativo vazio). O caminho do volume está nos metadados my_volume: stackoverflow.com/a/31997267/6309
VonC
Eu entendo que não há ponto de montagem no lado do host. Mas dentro do contêiner em execução iniciado com docker run ..., como posso gravar em um arquivo armazenado no my_volumevolume? Não sei o ... caminho? do volume dentro do meu contêiner em execução porque não defini nada? Espero estar claro o suficiente, porque definitivamente não tenho certeza do meu vocábulo: - /
radium226
1
@ radium226 o docker volume create --name anamecria um volume nomeado : Você atribui um caminho de contêiner em tempo de execução docker run -v aname:/apath:: esse contêiner agora tem um volume anexado a ele, montado em sua pasta / apath. Reescrevi a resposta para deixar isso claro.
VonC de
11

VOLUMEa instrução torna-se interessante quando você a combina com o volumes-fromparâmetro de tempo de execução.

Dado o seguinte Dockerfile:

FROM busybox
VOLUME /myvolume

Crie uma imagem com:

docker build -t my-bb .

E gire um contêiner com:

docker run --rm -it --name my-first-bb my-bb

A primeira coisa a notar é que você terá uma pasta chamada nesta imagem myvolume. Mas não é particularmente interessante, pois quando sairmos do contêiner o volume também será removido.

Crie um arquivo vazio nesta pasta, então execute o seguinte no contêiner:

cd myvolume
touch hello.txt

Agora gire um novo contêiner, mas compartilhe o mesmo volume com my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Você verá que my-second-bbcontém o arquivo hello.txtna myvolumepasta.

Depois de sair de ambos os contêineres, seu volume também será removido.

Koray Tugay
fonte
Os volumes serão excluídos porque são volumes anônimos E você iniciou os contêineres com a --rmopção. Eu acho que pode funcionar mencionando isso. Se você não iniciou um contêiner com --rm, ainda pode remover o contêiner e seus volumes anônimos com docker rm -v my-container.
AymDev