Esta é uma síntese de vários recursos que acabei reunindo para colocar um ambiente Fig + Docker + rails em funcionamento. Eu confiei no incrível artigo de Matthias Kadenbach para fazer o compartilhamento de host funcionar. O Dockerfile do usuário do Github deepak é um bom ponto de partida para uma configuração do Docker rbenv. E o Fig + Rails funciona principalmente fora da caixa.
A escrita de Martin também é boa, mas você não deve precisar executar nenhum comando no kernel a partir do boot2docker> = 1.2.0.
Aqui está o que funcionou para mim:
Instale boot2docker
Para garantir que as adições de convidados do VirtualBox funcionem, você precisa obter uma versão bem recente ( veja também )
Instale o boot2docker mais recente aqui
Baixe o ISO boot2docker mais recente com adições de Geust VirtualBox:
Você precisará disso para compartilhar seu sistema de arquivos local por meio do contêiner em execução na VM boot2docker. Verifique se você está usando o ISO apropriado para sua versão do boot2docker
cd ~/.boot2docker
mv boot2docker.iso boot2docker.iso.orig
curl http://static.dockerfiles.io/boot2docker-v1.2.0-virtualbox-guest-additions-v4.3.14.iso > boot2docker.iso
boot2docker init
Habilitar compartilhamento de sistema de arquivos host
Isso compartilha sua partição / Users com a VM boot2docker:
VBoxManage sharedfolder add boot2docker-vm
--name home
--hostpath /Users
--automount
boot2docker up
Crie seu Dockerfile
Prefiro usar rbenv em vez de RVM ou chruby. Abaixo parece haver um padrão Docker + rbenv padrão, embora eu tenha certeza de que não seria muito difícil adaptá-lo para executar outro gerenciador de versão ruby. Como alternativa, existem alguns contêineres ruby pré-construídos no registro do Docker, mas eu prefiro usar um contêiner de estoque do Ubuntu. Link para a essência
FROM ubuntu:14.04
RUN apt-get update -qq && apt-get install -y build-essential nodejs npm git curl mysql-client libmysqlclient-dev
RUN mkdir -p /my_awesome_social_media_app
# Install rbenv
RUN git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv
RUN echo '# rbenv setup' > /etc/profile.d/rbenv.sh
RUN echo 'export RBENV_ROOT=/usr/local/rbenv' >> /etc/profile.d/rbenv.sh
RUN echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> /etc/profile.d/rbenv.sh
RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
RUN chmod +x /etc/profile.d/rbenv.sh
# install ruby-build
RUN mkdir /usr/local/rbenv/plugins
RUN git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
ENV RBENV_ROOT /usr/local/rbenv
ENV PATH $RBENV_ROOT/bin:$RBENV_ROOT/shims:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RUN rbenv install 2.1.2
RUN bash -l -c 'rbenv global 2.1.2; gem install bundler; rbenv rehash'
WORKDIR /my_awesome_social_media_app
# Cache Gemfile steps so we don't run bundle install every time other files change.
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ADD . /my_awesome_social_media_app
CMD bundle exec rails server
Instalar / Configurar Fig
Instalar e configurar o Fig deve ser tão simples quanto brew install fig
Em seguida, crie o seu . Aqui está uma configuração básica de webapp + MySQL, fique à vontade para substituir seu banco de dados favorito:fig.yml
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: fizzbuzz
web:
build: .
command: bundle exec rails server
volumes:
# This seems to work as-is once you expose /Users to the boot2docker vm.
- .:/my_awesome_social_media_app
links:
- mysql
ports:
- "3000:3000"
Crie o scaffold Rails e gere um novo aplicativo (Nota: necessário apenas para novos projetos)
Configure Gemfile / Gemfile.lock
Você precisa criar um Gemfile e um Gemfile.lock, para que Fig possa executar um . Observe que você só precisará fazer isso se estiver criando um novo aplicativo Rails. Os aplicativos de trilhos existentes podem pular esta parte.bundle install/exec
Primeiro, crie um Gemfile básico:
source 'https://rubygems.org'
gem 'rails', '~> 4.1.0'
E crie um Gemfile.lock vazio para que o contêiner possa montá-lo:
touch Gemfile.lock
Use a Fig para criar o contêiner.
Eu acho que você precisa executar fig build
duas vezes aqui para obter o Gemfile / Gemfile.lock devidamente instanciado. Provavelmente existe uma maneira mais limpa de fazer isso:
fig build
fig run web bundle exec rails new . --force --database=mysql --skip-bundle
fig build
Nota: Eu também estava tendo alguns problemas com bundler / rails reclamando sobre versionamento de . Consegui consertar isso fazendo um para que tudo seja atualizado.sass-rails
fig run web bundle update
Configure o Rails para se comunicar com o contêiner MySQL
No ambiente de desenvolvimento, Rails quer falar com um banco de dados rodando em localhost por padrão. No entanto, quando Fig executa o contêiner MySQL, ele injeta variáveis que você pode usar para descoberta de serviço .
Edite para se conectar ao contêiner MySQL vinculado, em vez de localhost:config/database.yml
...etc...
development:
<<: *default
password: <%= ENV['<YOURAPPNAME>_MYSQL_1_ENV_MYSQL_ROOT_PASSWORD'] %>
host: <%= ENV['<YOURAPPNAME>_MYSQL_1_PORT_3306_TCP_ADDR'] %>
database: my_awesome_social_media_app_development
...etc...
Crie / migre seu banco de dados
fig run web rake db:create db:migrate
e por fim…
Comece tudo
fig up
Isso deve fornecer a você um aplicativo Rails novinho em folha em sua instância boot2docker, ouvindo na porta 3000. Se você gostaria de mapear de volta para localhost, apenas execute em uma janela separada.boot2docker ssh -L3000:localhost:3000
Quando estiver pronto para construir / enviar seu contêiner, todos os docker
comandos padrão que vêm com o boot2docker também devem funcionar.
Feliz hacking.