Como não gosto de montar volumes como um link para um diretório host, criei um padrão para atualizar contêineres de docker com contêineres gerenciados por docker. A criação de um novo contêiner de docker --volumes-from <container>
fornecerá ao novo contêiner com as imagens atualizadas propriedade compartilhada dos volumes gerenciados pelo docker.
docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql
Ao não remover imediatamente o original my_mysql_container
ainda, você poderá voltar ao contêiner em funcionamento conhecido se o contêiner atualizado não tiver os dados corretos ou falhar em um teste de sanidade.
Nesse momento, normalmente executarei todos os scripts de backup que tenho para o contêiner para fornecer uma rede de segurança, caso algo dê errado
docker stop my_mysql_container
docker start my_mysql_container_tmp
Agora você tem a oportunidade de garantir que os dados que você espera estar no novo contêiner estejam lá e executar uma verificação de integridade.
docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container
Os volumes da janela de encaixe permanecerão enquanto houver um contêiner em uso, para que você possa excluir o contêiner original com segurança. Depois que o contêiner original é removido, o novo contêiner pode assumir o nome do original para deixar tudo tão bonito quanto deveria.
Há duas vantagens principais em usar esse padrão para atualizar contêineres do docker. Em primeiro lugar, elimina a necessidade de montar volumes nos diretórios host, permitindo que os volumes sejam transferidos diretamente para um contêiner atualizado. Em segundo lugar, você nunca está em uma posição em que não haja um contêiner de estivador funcionando; portanto, se a atualização falhar, você poderá reverter facilmente para o funcionamento anterior girando o contêiner de docker original novamente.