Estou tentando usar docker-machine com docker-compose. O arquivo docker-compose.yml tem as seguintes definições:
web:
build: .
command: ./run_web.sh
volumes:
- .:/app
ports:
- "8000:8000"
links:
- db:db
- rabbitmq:rabbit
- redis:redis
Ao correr docker-compose up -d
tudo vai bem até tentar executar o comando e ocorrer um erro:
Não é possível iniciar o contêiner b58e2dfa503b696417c1c3f49e2714086d4e9999bd71915a53502cb6ef43936d: [8] Erro do sistema: exec: "./run_web.sh": stat ./run_web.sh: nenhum arquivo ou diretório
Os volumes locais não são montados na máquina remota. Qual é a estratégia recomendada para montar os volumes locais com o código dos webapps?
docker
dockerfile
docker-compose
jdcaballerov
fonte
fonte
Respostas:
A máquina Docker monta automaticamente o diretório de usuários ... Mas às vezes isso não é suficiente.
Não sei sobre o docker 1.6, mas no 1.8 você PODE adicionar uma montagem adicional à docker-machine
Adicionar Ponto de Montagem de Máquina Virtual (parte 1)
CLI : (só funciona quando a máquina está parada)
VBoxManage sharedfolder add <machine name/id> --name <mount_name> --hostpath <host_dir> --automount
Portanto, um exemplo no Windows seria
GUI : (NÃO requer que a máquina seja parada)
<machine name>
(padrão)<host dir>
(e :)<mount name>
(e)Montagem em boot2docker (parte 2)
Monte manualmente no boot2docker :
docker-machine ip default
, etc ...sudo mkdir -p <local_dir>
sudo mount -t vboxsf -o defaults,uid=`id -u docker`,gid=`id -g docker` <mount_name> <local_dir>
Mas isso só é bom até você reiniciar a máquina, e então a montagem é perdida ...
Adicionando uma montagem automática ao boot2docker :
Enquanto estiver conectado à máquina
/mnt/sda1/var/lib/boot2docker/bootlocal.sh
, sda1 pode ser diferente para você ...Adicionar
Com essas mudanças, você deve ter um novo ponto de montagem. Este é um dos poucos arquivos que encontrei que é chamado na inicialização e é persistente. Até que haja uma solução melhor, isso deve funcionar.
Método antigo: menos recomendado , mas deixado como uma alternativa
/mnt/sda1/var/lib/boot2docker/profile
, sda1 pode ser diferente para você ...Adicionar
Como último recurso , você pode escolher a alternativa um pouco mais tediosa e pode apenas modificar a imagem de inicialização.
git -c core.autocrlf=false clone https://github.com/boot2docker/boot2docker.git
cd boot2docker
git -c core.autocrlf=false checkout v1.8.1
#ou sua versão apropriadarootfs/etc/rc.d/automount-shares
Adicione a
try_mount_share <local_dir> <mount_name>
linha logo antes de fi no final. Por exemploApenas certifique-se de não configurar o para qualquer coisa que o sistema operacional precise, como / bin, etc ...
docker build -t boot2docker .
#Isso levará cerca de uma hora na primeira vez :(docker run --rm boot2docker > boot2docker.iso
Isso funciona, é apenas longo e complicado
docker versão 1.8.1, docker-machine versão 0.4.0
fonte
/mnt/sda1/var/lib/boot2docker/profile
, você pode explicar por que mudou para o uso/mnt/sda1/var/lib/boot2docker/bootlocal.sh
? Além disso, riscar tanto texto não contribui para a legibilidade da sua resposta ;-)bootlocal.sh
método. Tudo o que posso dizer é que parece mais limpo apenas usar um comando de montagem como fiz nobootlocal.sh
do que no perfil. Além disso, normalmente, acredito que oprofile
pode ser executado várias vezes, e uma montagem só precisa ser executada uma vez, por isso faz mais sentido. Mas ambos podem funcionar.Também tive esse problema e parece que os volumes locais não são montados ao usar docker-machine. Uma solução de hack é
obter o diretório de trabalho atual da instância docker-machine
docker-machine ssh <name> pwd
use uma ferramenta de linha de comando como
rsync
copiar a pasta para o sistema remotoO pwd padrão é / root, então o comando acima seria
rsync -avzhe ssh --progress <name_of_folder> username@remote_ip:/root
NB: você precisará fornecer a senha para o sistema remoto. Você pode criar um rapidamente por ssh no sistema remoto e criando uma senha.
mude o ponto de montagem do volume em seu
docker-compose.yml
arquivo de.:/app
para/root/<name_of_folder>:/app
corre
docker-compose up -d
NB: quando as alterações são feitas localmente, não se esqueça de executar novamente
rsync
para enviar as alterações para o sistema remoto.Não é perfeito, mas funciona. Um problema está em andamento https://github.com/docker/machine/issues/179
Outro projeto que tenta resolver isso inclui docker-rsync
fonte
exit status 255
e tenho que recriar completamente a máquina.docker 1.10
edocker-machine 0.6.0
gist.github.com/cristobal/fcb0987871d7e1f7449eNo momento, não consigo ver nenhuma maneira de montar volumes em máquinas, então a abordagem agora seria copiar ou sincronizar de alguma forma os arquivos de que você precisa para a máquina.
Há conversas sobre como resolver esse problema no repositório github da docker-machine. Alguém fez uma solicitação de pull implementando scp na docker-machine e já está mesclado no master, então é muito provável que a próxima versão o inclua.
Como ainda não foi lançado, agora eu recomendaria que, se você tem seu código hospedado no github, apenas clone seu repo antes de executar o aplicativo
Atualização: Olhando mais além, descobri que o recurso já está disponível nos binários mais recentes , quando você os obtiver, poderá copiar seu projeto local executando um comando como este:
Sendo esta a forma geral:
Assim, você pode copiar arquivos de, para e entre máquinas.
Saúde! 1
fonte
Desde outubro de 2017, há um novo comando para docker-machine que resolve o problema, mas certifique-se de que não haja nada no diretório antes de executá-lo, caso contrário, ele pode se perder:
docker-machine mount <machine-name>:<guest-path> <host-path>
Verifique os documentos para obter mais informações: https://docs.docker.com/machine/reference/mount/
PR com a mudança: https://github.com/docker/machine/pull/4018
fonte
...:<guest-path> <host-path>
(e não o contrário). Algo tão simples e crítico quanto isso para anotar na documentação ... simplesmente não é!Se você escolher a opção rsync com docker-machine, poderá combiná-la com o
docker-machine ssh <machinename>
comando como este:rsync -rvz --rsh='docker-machine ssh <machinename>' --progress <local_directory_to_sync_to> :<host_directory_to_sync_to>
Ele usa este formato de comando de rsync, deixando em
HOST
branco:rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
( http://linuxcommand.org/man_pages/rsync1.html )
fonte
Finalmente descobri como atualizar o Windows Docker Toolbox para v1.12.5 e manter meus volumes funcionando adicionando uma pasta compartilhada no
Oracle VM VirtualBox
gerenciador e desabilitando a conversão de caminho. Se você tem o Windows 10+, é melhor usar o Docker para Windows mais recente.Primeiro a dor de atualização:
Exemplo de banco de dados Redis:
redis: image: redis:alpine container_name: redis ports: - "6379" volumes: - "/var/db/redis:/data:rw"
No Terminal Docker Quickstart ....
docker-machine stop default
- Certifique-se de que a VM esteja interrompidaNo Oracle VM VirtualBox Manager ...
default
VM via ou linha de comandoD:\Projects\MyProject\db
=>/var/db
Em
docker-compose.yml
..."/var/db/redis:/data:rw"
No Terminal Docker Quickstart ....
COMPOSE_CONVERT_WINDOWS_PATHS=0
(para a versão do Toolbox> = 1.9.0)docker-machine start default
para reiniciar a VM.cd D:\Projects\MyProject\
docker-compose up
deve funcionar agora.Agora cria banco de dados redis em
D:\Projects\MyProject\db\redis\dump.rdb
Por que evitar caminhos de host relativos?
Eu evitado caminhos de acolhimento relativas para Windows caixa de ferramentas como eles podem introduzir '\' caracteres inválidos. Não é tão bom quanto usar caminhos relativos a,
docker-compose.yml
mas pelo menos meus colegas desenvolvedores podem fazer isso facilmente, mesmo se sua pasta de projeto estiver em outro lugar, sem ter que hackear odocker-compose.yml
arquivo (ruim para SCM).Problema Original
Para sua informação ... Aqui está o erro original que recebi quando usei bons caminhos relativos limpos que costumavam funcionar bem para versões mais antigas. Meu mapeamento de volume costumava ser apenas
"./db/redis:/data:rw"
ERROR: for redis Cannot create container for service redis: Invalid bind mount spec "D:\\Projects\\MyProject\\db\\redis:/data:rw": Invalid volume specification: 'D:\Projects\MyProject\db\redis:/data
Isso quebra por dois motivos ..
D:
drive\
caracteresdocker-compose
adiciona e depois culpa você por isso !!COMPOSE_CONVERT_WINDOWS_PATHS=0
para parar com esse absurdo.Eu recomendo documentar seu mapeamento de pasta compartilhada VM adicional em seu
docker-compose.yml
arquivo, pois pode ser necessário desinstalar o VirtualBox novamente e redefinir a pasta compartilhada e, de qualquer forma, seus colegas desenvolvedores vão adorar você por isso.fonte
Todas as outras respostas foram boas para o momento, mas agora (Docker Toolbox v18.09.3) tudo funciona fora da caixa. Você só precisa adicionar uma pasta compartilhada no VirtualBox VM.
O Docker Toolbox adiciona automaticamente
C:\Users
uma pasta compartilhada/c/Users
na máquina virtual linux (usando o recurso de pastas compartilhadas do Virtual Box), portanto, se o seudocker-compose.yml
arquivo estiver localizado em algum lugar sob este caminho e você montar os diretórios da máquina host apenas neste caminho - tudo deve funcionar imediatamente.Por exemplo:
C:\Users\username\my-project\docker-compose.yml
:O
.
caminho será convertido automaticamente em caminho absolutoC:\Users\username\my-project
e depois em/c/Users/username/my-project
. E é exatamente assim que esse caminho é visto do ponto de vista da máquina virtual linux (você pode conferir:docker-machine ssh
e depoisls /c/Users/username/my-project
). Então, a montagem final será/c/Users/username/my-project:/app
.Tudo funciona de forma transparente para você.
Mas isso não funciona se o caminho de montagem do host não estiver sob o
C:\Users
caminho. Por exemplo, se você colocar o mesmodocker-compose.yml
emD:\dev\my-project
.Isso pode ser corrigido facilmente.
docker-machine stop
).Abra a GUI do Virtual Box, abra as configurações da máquina virtual nomeada
default
, abra aShared Folders
seção e adicione a nova pasta compartilhada:D:\dev
d/dev
Pressione
OK
duas vezes e feche a GUI do Virtual Box.docker-machine start
).Isso é tudo. Todos os caminhos da máquina host sob
D:\dev
devem funcionar agora nasdocker-compose.yml
montagens.fonte
Pode ser combinação bruxa feito de três ferramentas:
docker-machine mount
,rsync
,inotifywait
Digamos que você tenha seu
docker-compose.yml
erun_web.sh
em/home/jdcaballerov/web
docker-machine machine:/home/jdcaballerov/web /tmp/some_random_dir
rsync -r /home/jdcaballerov/web /tmp/some_random_dir
Sincronize a cada mudança de arquivos em seu diretório:
ATENÇÃO - há dois diretórios com o mesmo caminho - um está na máquina local (host), o segundo está na máquina docker.
fonte
Presumo que o
run_web.sh
arquivo esteja no mesmo diretório do seudocker-compose.yml
arquivo. Então o comando deve sercommand: /app/run_web.sh
.A menos
Dockerfile
que (que você não está divulgando) se encarregue de colocar orun_web.sh
arquivo na imagem do Docker.fonte
Depois de resumir as postagens aqui, o script atualizado anexado cria um ponto de montagem de host adicional e montagem automática quando o Virtualbox reiniciar. O resumo do ambiente de trabalho é o seguinte: - Windows 7 - docker-machine.exe versão 0.7.0 - VirtualBox 5.0.22
fonte
Estou usando docker-machine 0.12.2 com a unidade virtualbox em minha máquina local. Descobri que existe um diretório
/hosthome/$(user name)
de onde você tem acesso aos arquivos locais.fonte
Pensei em mencionar que estou usando 18.03.1-ce-win65 (17513) no Windows 10 e percebi que, se você compartilhou uma unidade e armazenou as credenciais em cache, depois de alterar sua senha, o docker começará a ter os volumes montados em contêineres em branco.
Não dá nenhuma indicação de que o que realmente está acontecendo é que agora ele não está conseguindo acessar o compartilhado com as credenciais antigas armazenadas em cache. A solução neste cenário é redefinir as credenciais por meio da IU (Configurações-> Unidades compartilhadas) ou desabilitar e, em seguida, reativar o compartilhamento da unidade e inserir a nova senha.
Seria útil se docker-compose fornecesse um erro nessas situações.
fonte