Introdução
Não consigo descobrir uma boa maneira de configurar um ambiente de desenvolvimento no OS X usando Docker e Boot2Docker. O problema que estou enfrentando é como gerenciar o código-fonte para que:
- Posso modificar o código no OS X usando as ferramentas (editor de texto, IDE, git, etc) que já instalei.
- Essas modificações são refletidas no contêiner do Docker, portanto, se eu executar novamente os testes ou atualizar uma página da Web, posso ver minhas alterações imediatamente.
Em teoria, isso deve ser fácil de fazer montando meu código-fonte como um volume:
docker run -it -v /path/to/my/source/code:/src some-docker-image
Infelizmente, isso tem dois problemas principais que o tornam completamente inutilizável no OS X:
Problema nº 1: os volumes montados no VirtualBox (que usam vboxsf) são extremamente lentos
Por exemplo, veja quanto tempo Jekyll leva para compilar minha página inicial se o código-fonte fizer parte da imagem Docker:
> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash
root@7aaea30d98a1:/src# time bundle exec jekyll build
[...]
real 0m7.879s
user 0m7.360s
sys 0m0.600s
Aqui está exatamente a mesma imagem do Docker, só que desta vez, eu monto o código-fonte do OS X:
> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash
root@1521b0b4ce6a:/src# time bundle exec jekyll build
[...]
real 1m14.701s
user 0m9.450s
sys 0m3.410s
Problema nº 2: a observação de arquivos está corrompida
Os mecanismos de observação padrão no SBT, Jekyll e grunt usam tecnologias como inotify, que não funcionam se estiverem sendo executados em um contêiner do Docker e as alterações forem feitas no OS X para uma pasta montada.
Soluções alternativas que tentei
Procurei soluções (incluindo todas no SO) e tentei algumas delas, mas não encontrei nenhuma bem-sucedida:
- I comutada Boot2Docker usar NFS , mas era tão lento.
- Tentei o Vagrant + NFS , e também era lento.
- Tentei uma montagem Samba , mas a pasta sempre apareceu vazia no contêiner do Docker.
- Tentei usar o sistema de arquivos Unison , que funcionou brevemente para sincronizar arquivos, mas continuou mostrando erros de conexão .
- Habilitei a votação no Jekyll , mas isso aumentou significativamente o atraso até que minhas alterações fossem selecionadas.
- Experimentei o Dinghy , um "Docker mais rápido e amigável no OS X com Vagrant" e consegui algumas melhorias. Em vez da compilação do Jekyll ser 10-15x mais lenta, foi 2-3x mais lenta. Está melhor, mas ainda não é totalmente utilizável.
Alguém encontrou uma solução que realmente funcione e permita desenvolver código produtivamente com Docker e OS X?
Atualização: enfim uma solução!
Finalmente encontrei uma solução que parece produtiva usando Boot2Docker + rsync. Capturei os detalhes sobre como configurar isso em minha própria resposta , bem como em um projeto de código aberto chamado docker-osx-dev .
fonte
Respostas:
Decidi adicionar minha própria resposta com a melhor solução que encontrei até agora. Vou atualizar isso se encontrar opções melhores.
Melhor solução até agora
A melhor solução que encontrei para configurar um ambiente de desenvolvimento produtivo com Docker no OS X é: Boot2Docker + Rsync . Com o rsync, os tempos de construção em um contêiner do Docker estão no mesmo nível que a execução da construção diretamente no OSX! Além disso, o código do inspetor de arquivos não precisa de pesquisa (
inotify
funciona, pois o rsync usa pastas normais), então o recarregamento a quente é quase tão rápido.Existem duas maneiras de configurá-lo: uma instalação automatizada e uma instalação manual.
Instalação automatizada
Eu empacotei todas as etapas para configurar o Boot2Docker com Rsync em um projeto de código aberto chamado docker-osx-dev . O código é um pouco grosseiro, mas tenho usado com sucesso por várias semanas para alternar facilmente entre 3 projetos com 3 pilhas de tecnologia diferentes. Experimente, relate bugs e envie alguns PRs! Além disso, consulte minha postagem do blog, Um ambiente de desenvolvimento produtivo com Docker no OS X para obter mais informações.
Configuração manual
brew install boot2docker
.boot2docker init && boot2docker start --vbox-share=disable
.boot2docker shellinit
e copie as variáveis de ambiente que ele imprime em seu~/.bash_profile
arquivo.boot2docker ssh "tce-load -wi rsync"
./foo/bar
pasta do OS X, você precisa criar/foo/bar
na Boot2Docker VM:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
.rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo
. Verifique os documentos rsync para várias configurações que você pode querer habilitar, como usar--exclude .git
para excluir a.git
pasta durante a sincronização.brew install fswatch
) canalizado para rsync.docker run
para disparar o seu recipiente Docker e usar a-v
bandeira para montar a pasta que você está sincronizando:docker run -v /foo/bar:/src some-docker-image
.inotify
), e a construção deve ser executada rapidamente porque todos os arquivos são "locais" para o contêiner.boot2docker ip
comando para descobrir em qual IP ele está.fonte
VOLUME
, então você pode dar a outro contêiner acesso a esse volume usando o--volumes-from
bandeira. Ainda não tentei, mas suspeito que funcionaria.Atualização : agora que o docker para mac está em beta com funcionalidade não hack, seguir esse caminho pode ser muito mais razoável para o desenvolvimento local sem um ensaio de hacks e soluções alternativas.
Não . Eu sei que essa não é a resposta que você provavelmente está esperando, mas faça uma avaliação honesta do custo / benefício de tentar obter o código-fonte local + execução dockerizada versus apenas fazer o desenvolvimento local no OSX.
Em algum ponto, todos os problemas, esforço de configuração e pontos problemáticos operacionais PODEM ser resolvidos bem o suficiente, mas a partir de agora minha opinião sobre isso é uma perda líquida.
Espere um pouco e isso certamente melhorará.
Não tenho certeza se uma solução para isso está em um futuro próximo. Se esse tipo de funcionalidade é a chave para o seu fluxo de trabalho de desenvolvimento, eu consideraria isso um problema. Não vale a pena um grande esforço de P&D quando comparado a apenas usar rbenv / bundler para gerenciar suas instalações de jekyll / ruby e executá-las localmente no OSX como as pessoas têm feito com sucesso na última década +.
Assim como "a nuvem" tem envolvimento zero em minha configuração de desenvolvimento local, no momento, docker é uma vitória para teste / preparação / implantação e para execução de bancos de dados e outros componentes de terceiros, mas os aplicativos que estou codificando são executados diretamente no OSX.
fonte
Docker para Mac e Windows deve ser a forma definitiva de desenvolver com Docker no OS X (e Windows). Um produto Docker, o software é um “ambiente integrado e fácil de implantar para criar, montar e enviar aplicativos do Mac ou Windows”. Pretende resolver os problemas apresentados pelo OP. De seu anúncio de 24 de março de 2016 :
fonte
Isenção de responsabilidade: posso ser tendencioso, já que sou o autor de docker-sync.
Provavelmente tentei todas as soluções nomeadas aqui, incluindo algumas mais (veja a compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), mas basicamente falharam no lado de desempenho (a maioria deles) ou na máquina docker (ou nenhum) usado / forçado.
http://docker-sync.io foi construído para unir todas as soluções e fornecer as melhores estratégias (implementação de várias, você pode escolher).
Pode ser usado com rsync (sincronização de 1 via), incluindo correções de permissão para usuários, e com uníssono (sincronização de 2 vias). Ele não força você a entrar na docker-machine ou em um hypervisor específico, nem exige que você tenha o docker para Mac. Funciona com todos eles.
O desempenho EugenMayer / docker-sync / wiki / 4.-Performance não é influenciado, é como se você não tivesse compartilhamentos.
docker-sync e seus observadores de mudanças são otimizados e funcionam com projetos com arquivos de 12k sem problemas.
Experimente, se quiser, eu adoraria ouvir seus comentários!
fonte
Eu entendo você! Acho que tentei quase tudo que você tentou e, infelizmente, ainda estava lento. Então me deparei com este comentário https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 que sugere o uso de Vagrant e Parallels em vez de Virtualbox. Isso me permitiu usar nfs e realmente vi um grande aumento de desempenho em meu projeto (Drupal).
Aqui está o arquivo Vagrant. Tudo que você precisa fazer é instalar o vagrant, copiar em um arquivo chamado Vagrantfile e colocá-lo em alguma pasta. Vá para essa pasta e execute um
vagrant up
boot2docker em vez de seu boot2docker normal.fonte
Também estou usando o Vagrant com paralelos e boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). O desenvolvimento nunca foi tão fácil para mim. Funciona muito bem com
docker-compose
configurações grandes. Eu realmente não sinto atraso ou consumo massivo de recursos.É assim que meu se
Vagrantfile
parece:fonte
Estou desenvolvendo em um ambiente OS X (meados de 2011 Macbook Air) + Boot2Docker + Docker-compose há algumas semanas. Não encontrei grandes problemas de desempenho, mas evito executar qualquer tipo de construção durante o desenvolvimento (por que não usar algo como
jekyll serve --skip-initial-build
?). Aqui está umdocker-compose.yml
arquivo de exemplo que estou usando:docker-compose.yml:
Dockerfile:
Às vezes, uso NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ), mas não notei uma grande diferença de desempenho ao fazer isso.
Para mim, a conveniência de
docker-compose up test
colocar meu ambiente em execução simples tem compensado o custo em desempenho (trabalho rotineiramente em vários projetos com pilhas diferentes).PS:
nodemon
é um dos poucos observadores de arquivo que funcionam com vboxsf (consulte https://github.com/remy/nodemon/issues/419 ).fonte
Docker Unison funciona perfeitamente! https://github.com/leighmcculloch/docker-unison
Sincronização bidirecional com muito bom desempenho!
fonte
É possível fazer o docker funcionar como uma ferramenta de desenvolvimento. Mas vai doer. Documentei o processo aqui:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
fonte
Este método é a maneira mais recente (setembro de 2015) e mais fácil de obter a configuração do Docker no Mac: link aqui:
Você instala o Docker usando o link Docker Toolbox para obter instruções aqui:
É um pacote completo de instalação do Docker, que inclui as seguintes ferramentas do Docker:
Máquina Docker para executar o binário docker-machine
Docker Engine para executar o binário do docker
Docker Compose para executar o binário docker-compose
Kitematic, o Docker GUI um shell pré-configurado para um ambiente de linha de comando do Docker
Oracle VM VirtualBox
O que há na caixa de ferramentas:
fonte