Docker + Fig + Rails no OS X

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 buildduas 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-railsfig 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 dockercomandos padrão que vêm com o boot2docker também devem funcionar.

Feliz hacking.