A VOLUMEinstrução cria um volume de dados em seu contêiner do Docker no tempo de execução. O diretório fornecido como um argumento para VOLUMEé um diretório que ignora o Union File System e é usado principalmente para dados persistentes e compartilhados.
Se você executar docker inspect <your-container>, verá na Mountsseção que há um Sourceque representa o local do diretório no host e um Destinationque representa o local do diretório montado no contêiner. Por exemplo,
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
Aqui estão três casos de uso para docker run -v:
docker run -v /data: Isso é análogo a especificar a VOLUMEinstrução em seu Dockerfile.
docker run -v $host_path:$container_path: Isso permite que você monte a $host_pathpartir de seu host $container_pathem seu contêiner durante o tempo de execução. No desenvolvimento, isso é útil para compartilhar o código-fonte em seu host com o contêiner. Na produção, isso pode ser usado para montar coisas como as informações de DNS do host (encontradas em /etc/resolv.conf) ou segredos no contêiner. Por outro lado, você também pode usar essa técnica para gravar os logs do contêiner em pastas específicas no host. Ambos $host_pathe$container_path devem ser caminhos absolutos.
docker run -v my_volume:$container_path: Isso cria um volume de dados em seu contêiner em $container_pathe nomeia-o my_volume. É essencialmente o mesmo que criar e nomear um volume usando docker volume create my_volume. Nomear um volume como este é útil para um volume de dados de contêiner e um volume de armazenamento compartilhado usando um driver de armazenamento de vários hosts como o Flocker .
Observe que a abordagem de montar uma pasta de host como um volume de dados não está disponível no Dockerfile. Para citar a documentação do docker ,
Nota: Isso não está disponível em um Dockerfile devido à portabilidade e ao propósito de compartilhamento dele. Como o diretório do host é, por natureza, dependente do host, um diretório do host especificado em um Dockerfile provavelmente não funcionaria em todos os hosts.
Agora, se você deseja copiar seus arquivos para contêineres em ambientes que não sejam de desenvolvimento, você pode usar as instruções ADDou COPYem seu Dockerfile. Eles são o que eu geralmente uso para implantação de não desenvolvimento.
COPYaADD. Eles são quase iguais, masADDtêm algumas habilidades extras para escrever URLs e arquivos compactados que podem ser surpreendentes.