Eu tenho um contêiner do Docker que eu criei simplesmente instalando o Docker no Ubuntu e fazendo:
sudo docker run -i -t ubuntu /bin/bash
Comecei imediatamente a instalar o Java e algumas outras ferramentas, passe algum tempo com ele e parei o contêiner
exit
Então, eu queria adicionar um volume e percebi que isso não é tão simples quanto eu pensava que seria. Se eu usar sudo docker -v /somedir run ...
, acabarei com um novo contêiner novo, para que eu instale o Java e faça o que já fiz antes apenas para chegar a um contêiner com um volume montado.
Toda a documentação sobre a montagem de uma pasta no host parece implicar que a montagem de um volume é algo que pode ser feito ao criar um contêiner. Portanto, a única opção que tenho para evitar a reconfiguração de um novo contêiner do zero é confirmar o contêiner existente em um repositório e usá-lo como base de um novo enquanto monta o volume.
Essa é realmente a única maneira de adicionar um volume a um contêiner existente?
docker
tag são 34k + , que são muito mais do que os dois locais stackoverflow.com/questions/tagged/dockerRespostas:
Você pode confirmar seu contêiner existente (ou seja, criar uma nova imagem a partir das alterações do contêiner) e executá-lo com suas novas montagens.
Exemplo:
Se estiver tudo bem, pare seu recipiente antigo e use este novo.
É isso aí :)
fonte
newnameofcontainer
que provavelmente deve ser nomeadonew_image_name
- porquedocker commit
cria uma nova imagem no seu sistema. Em seguida, quando você faz um,docker run
você realmente usa o nome da imagem da qual deseja executar um novo contêiner. O exemplo acima funciona, mas você gostaria de esclarecer aos outros que o espaço reservado newnameofcontainer acima é realmente o nome de uma nova imagem. obrigado! resposta incrível. oh, você pode ver a imagem recém-criado a partir da primeira janela de encaixe comando commit utilizandodocker image ls
docker run -v /srv/a:/tmp ubuntu:14.04
é bom.Não temos como adicionar volume no contêiner em execução, mas para atingir esse objetivo, você pode usar os comandos abaixo:
Copie arquivos / pastas entre um contêiner e o sistema de arquivos local: -
Para referência, consulte:
https://docs.docker.com/engine/reference/commandline/cp/
fonte
Montei com êxito a
/home/<user-name>
pasta do meu host na/mnt
pasta do contêiner existente (não em execução). Você pode fazer isso da seguinte maneira:Abra o arquivo de configuração correspondente ao contêiner parado, que pode ser encontrado em
/var/lib/docker/containers/99d...1fb/config.v2.json
(pode serconfig.json
para versões mais antigas do docker).Encontrar
MountPoints
seção, que estava vazio no meu caso:"MountPoints":{}
. Em seguida, substitua o conteúdo por algo assim (você pode copiar o conteúdo adequado de outro contêiner com as configurações adequadas):ou o mesmo (formatado):
service docker restart
Isso funciona para mim com o Ubuntu 18.04.1 e o Docker 18.09.0
fonte
systemctl stop docker.service
2. Editeconfig.v2.json
:vim <(jq . /var/lib/docker/containers/<container-ID>/config.v2.json)
3. Salve as atualizações em um arquivo::w config.v2.json
4. Saia do vim::q!
5. Atualize o arquivo existente:jq -c . config.v2.json > /var/lib/docker/containers/<container-ID>/config.v2.json
6. Inicie o mecanismo do docker:systemctl start docker.service
7. Inicie o contêiner, se necessário :docker start <container-name/ID>
8. Aproveite :-)service docker restart
. Eu tentei,docker restart <container>
então a nova configuração não é escolhida e está sendo substituída pela antiga configuração.jq
ajudará a imprimir bastante o JSON, por isso é mais humano editável:cat config.v2.json | jq . > config.json
Jérôme Petazzoni tem uma postagem de blog bastante interessante sobre como anexar um volume a um contêiner enquanto estiver em execução . Isso não é algo embutido no Docker, mas é possível.
Como ele também aponta
YMMV
fonte
Infelizmente, a opção de alternar para montar um volume é encontrada apenas no
run
comandodocker run --help
-v, --volume list Bind mount a volume (default [])
Existe uma maneira de solucionar isso, para que você não precise reinstalar os aplicativos que você já configurou no seu contêiner.
docker container export -o ./myimage.docker mycontainer
docker import ./myimage.docker myimage
docker run -i -t -v /somedir --name mycontainer myimage /bin/bash
fonte
docker container
não é um comando válido no 1.11.2 (que é a versão mais recente suportada pela Synology até o momento em que este documento foi escrito). Não consigo encontrar nenhum documento dizendo quando foi adicionado. Nesse caso, o primeiro comando édocker export -o ./myimage.docker mycontainer
.Uma observação sobre o uso de contêineres do Docker Windows depois que tive que procurar esse problema por um longo tempo!
Condições:
Problema:
Solução parcialmente descrita aqui:
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
docker exec -it <CONTAINERID> cmd.exe
mkdir DirForMount
docker container stop <CONTAINERID>
docker commit <CONTAINERID> <NEWIMAGENAME>
docker container rm <CONTAINERID>
docker run -d -p 1433:1433 -e sa_password=<STRONG_PASSWORD> -e ACCEPT_EULA=Y -v C:\DirToMount:C:\DirForMount <NEWIMAGENAME>
Depois disso, resolvi esse problema nos contêineres do Windows docker.
fonte
A melhor maneira é copiar todos os arquivos e pastas dentro de um diretório em seu sistema de arquivos local:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
SRC_PATH
está no contêinerDEST_PATH
está no host localEm seguida,
docker-compose down
anexe um volume ao mesmoDEST_PATH
e execute os contêineres do Docker usandodocker-compose up -d
Adicione volume seguindo em
docker-compose.yml
fonte