Docker transforma volume anônimo em volume nomeado

Eu tentei uma imagem docker usando a linha de comando docker sem especificar nomes para volumes. Agora descobri que quero continuar usando este contêiner / imagem, mas definindo o contêiner no Docker compose.

O que é recomendado para manter os dados dos volumes anônimos/não identificados e usá-los no novo contêiner criado pelo docker compose?

  • Posso de alguma forma converter o sem nome em volumes nomeados?
  • ou devo criar um novo contêiner com Docker compose com volumes nomeados e copiar os dados?
  • ou qualquer outra opção?

Para resumir o alternativa:

docker volume create --name <new_volume>docker run --rm -it -v <old_volume>:/from:ro -v <new_volume>:/to alpine \    ash -c "cd /from ; cp -av . /to"docker volume rm <old_volume>

Este método tem o benefício de usar a API docker. Ele usa uma imagem Linux leve chamada alpine e seu shell padrão, ash para executar uma cópia de arquivo, cp -av do volume antigo ao volume recém-nomeado.

No momento, você não pode renomear volumes existentes. (Isso é verdade se eles foram nomeados anteriormente ou não e tiveram seus nomes gerados automaticamente.)

Você pode ver problema para obter mais informações sobre a implementação desse recurso, além de adicionar seus "+1"/"polegares para cima" para que os desenvolvedores saibam que você deseja.

Sem isso, até onde eu sei, a única boa maneira de fazer isso é criar o novo volume nomeado e copiar os dados.

A resposta do CivFan não funcionou para mim como está, então estou postando minha solução aqui:

docker run --rm --volumes-from <container_name> -v <new_volume_name>:/to ubuntu bash -c "cd <source_dir>; cp -r . <dest_dir>/."

Isso copia o conteúdo de source_dir no recipiente com container_name em dest_dir dentro do novo volume new_volume_name.

Para verificar se funcionou, você pode listar o conteúdo de dest_dir com:

docker run --rm -i -v <new_colume_name>:/tmp ubuntu find /tmp

No momento da escrita, a única opção é copiar os dados. Os detalhes podem variar dependendo da sua configuração específica. A lista geral de etapas a serem executadas é a seguinte:

  1. Pare e remova o contêiner de origem para permitir que o novo volume seja criado na Etapa 3.

    docker stop NAMEdocker rm NAME# ordocker-compose stop SERVICEdocker-compose rm SERVICE

    Em alguns casos, você pode adiar a remoção do contêiner de origem, por exemplo, ao mudar de docker-compose volume anônimo para docker-compose volume nomeado. Neste caso up criaria o novo volume. E você pode prosseguir com a cópia dos dados. Mas, mesmo neste caso, é aconselhável interromper o contêiner para evitar que os dados sejam alterados conforme você os copia. E você tem que remover o contêiner de origem para docker-compose para mudar para o novo volume (preste atenção aos avisos).

    Em alguns casos, não é realmente necessário, por exemplo, ao mudar de contêineres autônomos para docker-compose.

  2. Alterar docker-compose.yml se aplicável.

  3. Inicie o novo contêiner para que o novo volume seja criado.

    Contêineres autônomos:

    docker run ...# ordocker-compose up -d
  4. Pare o novo contêiner para evitar que os dados sejam alterados.

    docker stop ...# ordocker-compose stop

    No caso de migrar para, por exemplo, um contêiner autônomo com um volume nomeado, você pode apenas criar o volume no lugar de iniciar/interromper o contêiner.

  5. Copie os dados.

    docker run --rm -v "SRC_VOLUME:/from" -v "DST_VOLUME:/to" \    bash -c '        shopt -s dotglob        # rm -r /to/*  # e.g. pg might have populated the new volume        cp -r /from/* /to    '

    Onde SRC_VOLUME, dst_volume-nome do volume, id ou caminho absoluto para um diretório no host.

    Para listar volumes anexados a um contêiner, use:

    docker inspect CONTAINER --format '{{json .Mounts}}' | jq

    Onde CONTAINER - nome do contêiner ou id.

  6. Inicie o novo contêiner.

    docker run ...# ordocker-compose up -d
  7. Regozijar :)

Caso você queira experimentar diferentes configurações, confira o seguinte essência.

Encontrei isso procurando informações sobre volumes nomeados. Eu percebo que este é um post antigo, mas depois de lê-lo eu fiz algumas pesquisas e descobri que é possível neste momento, pelo menos, para exportar o sistema de arquivos como um tarball, e importar um tarball para a imagem ou como uma imagem.

Primeiro exporte o sistema de arquivos de seus contêineres:

docker container export -o filename CONTAINER

E depois / ao criar um novo contêiner, importe o tarball para o sistema de arquivos:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

Se você especificar um arquivo, o Docker o desvinculará no contêiner em relação ao / (root).

Você também pode criar imagens não marcadas com este pequeno dândi:

docker import filesystem.tar