Setup para desenvolvimento com Docker

Olá a todos :slight_smile:
O Openredu está agora, na sua ultima versão, já pronto para rodar em Containers Docker. Como isso muda a forma como a configuração para um ambiente de desenvolvimento é feita, fiz esse tutorial para quem estiver desenvolvendo a partir da última versão :wink:

Tutorial de Instalação Openredu – Latest

O tutorial a seguir foi feito em um sistema Linux 18.04 LTS, assim que foi instalado.
A versão de desenvolvimento atualmente conta com o uso da plataforma Docker.

Passos:

1. Instalando Docker
2. Instalando Docker-Compose
3. Clonando o repositório ou o seu fork
4. [OPCIONAL] Clonando os repositorios vis e livredoc
5. Construindo o Container Openredu
6. Subindo o Container Openredu
7. Acessando!

1. Instalando o Docker

Pra que serve o Docker?
O docker é uma plataforma de software que permite a criação, o teste e a implantação de aplicações rapidamente. O docker cria pacotes de software em unidades padronizadas chamadas de contêineres que têm tudo o que o software precisa para ser executado, inclusive bibliotecas, ferramentas de sistema, código e runtime. Ao usar o docker, é possível implantar e escalar rapidamente aplicações em qualquer ambiente e ter a certeza de que o seu código será executado.
Fonte: Amazon AWS

Em resumo, podemos ver o Docker como uma espécie de máquina virtual, só que muito mais leve, pois ela não precisa instalar o sistema operacional todo, funcionando em cima do sistema operacional host para obter estruturas essenciais como kernel, mas por si, é um sistema encapsulado independente.

Para instalar, execute no seu terminal:

 $ sudo apt-get install docker

2. Instalando o Docker Compose

Pra quê serve o Docker-Compose?
O Docker Compose é uma ferramenta para a criação e execução de múltiplos containers de aplicação. Com o Compose, você usar um arquivo do tipo yaml para definir como será o ambiente de sua aplicação e usando um único comando você criará e iniciará todos os serviços definidos.

Compose é ótimo para desenvolvimento, testes e homologação, bem como para melhorar o fluxo de integração continua.
Fonte: Mundo Docker

Execute no seu terminal:

$ sudo apt-get install docker-compose

3. Clonando o repositório ou o seu fork

Agora, precisamos clonar o repositório do Openredu que desejamos trabalhar. No caso, estou clonando o branch master do repositório oficial, que já está com docker implementado. Você pode clonar um fork que tenha feito a partir do repositório principal, contanto que já esteja com docker:

Para clonar, vá até o diretório que deseja armazenar os arquivos do repositório e digite no seu terminal:

$ git clone https://github.com/Openredu/Openredu

4.[OPCIONAL] Clonando os repositorios vis e livredoc

Caso esteja desenvolvendo também nas APIs externas ‘Vis’ ou ‘Livredoc’, será necessário realizar um clone de seus repositórios e alternar para o branch do docker. Se não desejar, apenas lembre-se de alterar seu arquivo .env para apontar para os endereços dessas APIs, como seguem:

VIS: ‘vis.openredu.org’
LIVREDOC: ‘livredoc.openredu.org’

Não é obrigatório que os dois sejam clonados . Pode-se clonar apenas o repositório VIS e desenvolver nele (alterando a variável de ambinete para o localhost apropriado, mais detalhes no último passo do guia), enquanto o LIVREDOC usado será o do endereço acima.

Para isso, estando no diretório desejado, digite no seu terminal:

$ git clone https://github.com/Openredu/vis
$ git clone https://github.com/Openredu/livredoc
$ cd vis
$ git checkout deploy-docker
$ cd ..
$ cd livredoc
$ git checkout deploy-docker
$ cd ..

O que fizemos acima foi clonar os dois repositórios, entrar em cada um deles e alterar a branch atual de “master” para “deploy-docker”, que é onde temos a aplicação “dockerizada”.

5. Construindo o Container Openredu

Agora, vamos configurar a aplicação para rodar localmente para que possamos desenvolver e também testar:

No seu terminal:

$ cd Openredu
$ sudo docker-compose build

Agora espere o processo de download de todas as dependências do container. Nada será instalado na sua máquina, apenas dentro do container.

Agora execute:

$ sudo docker-compose run --rm app bundle exec rake db:setup

Esse comando cuidará de subir temporariamente os containers que construímos, executar “rake db:setup” para criar todas databases e rodar todos os migrates em development e em test, e depois, como fornecemos a flag --rm, os containers serão removidos.

OBS: Pode ser que a database de testes não seja criada com esse comando. Se não for, rode em seguida:

$ sudo docker-compose run --rm app bundle exec rake db:setup RAILS_ENV=test

6. Subindo o Container Openredu

Finalmente, no seu terminal digite:

$ sudo docker-compose up

O docker-compose se encarregará de criar as networks e volumes necessários. As networks servem para que os containeres do banco e do Openredu comuniquem-se entre si. Os volumes servem para mapear uma seção da maquina host no container. Isso significa que podemos alterar o código do openredu normalmente enquantooooo desenvolvemos, sem a necessidade de subir o container a todo momento para ver as modificações. As mudanças feitas no código do Openredu na máquina local são automaticamente refletidas no container.

[OPCIONAL]
Caso tenha optado por desenvolver também VIS e/ou LIVREDOC, não esqueça de executar, no diretório clonado de cada um:

$ sudo docker-compose build

Para livredoc, em seguida, execute:

$ sudo docker-compose run --rm livredoc bundle exec rake db:setup

Para vis, execute:

$ sudo docker-compose run --rm vis bundle exec rake db:setup

E por fim, para cada um deles, execute:

$ sudo docker-compose up

7. Acessando

Por último vamos conferir se as páginas estão funcionando corretamente. Para isso, acesse pelo seu navegador:

Openredu:

localhost:3000

Livredoc:

localhost:4000

Vis:

localhost:4002

Se tudo estiver ok, devemos ver a tela de login do Openredu, e duas páginas dizendo “You’re on Rails”, pois por serem APIs não necessitam de homepage, ficando então com a página padrão do Rails.

Por enquanto é isso, se tiverem algum problema durante a instalação, ou alguma sugestão para o guia, basta me comunicar, atualizarei o mais rápido possível :slight_smile:

Regards,
~hscs

5 curtidas

Testei aqui, rodou tudo! :slight_smile:

2 curtidas

Para quem tem outro sistema operacional, acredito que não funcionará pelos comandos linux no docker.

Tentei usar no MACOS e não funcionou.

acredito que usar o vagrant seria mais adequado nesta situação.

1 curtida

Ao rodar o comando acima é retornado:
WARNING: The RAILS_ENV variable is not set. Defaulting to a blank string.
WARNING: The RACK_ENV variable is not set. Defaulting to a blank string.
db uses an image, skipping
mongo uses an image, skipping
Building app
Step 1/13 : FROM ruby:1.9.3
1.9.3: Pulling from library/ruby
a3ed95caeb02: Pull complete
bac86908ce0f: Pull complete
b09f24cd3436: Pull complete
eb51437d7378: Pull complete
a8c2a8b7abc6: Pull complete
6978db43a39a: Pull complete
3ab7953dcb50: Pull complete
e19ede738f87: Pull complete
Digest: sha256:c296bd581b8c1ee0585a77cafc0b14342356cea30a10fa2c9f82370909665149
Status: Downloaded newer image for ruby:1.9.3
—> fdc96adae46d
Step 2/13 : RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs imagemagick
—> Running in ee0af4ef93e3
W: Failed to fetch http://http.debian.net/debian/dists/jessie-updates/InRelease Unable to find expected entry
‘main/binary-amd64/Packages’ in Release file (Wrong sources.list entry or malformed file)

E: Some index files failed to download. They have been ignored, or old ones used instead.
ERROR: Service 'app' failed to build: The command '/bin/sh -c apt-get update -qq && apt-get install -y build- 
essential libpq-dev nodejs imagemagick' returned a non-zero code: 100
2 curtidas

Olá @jonas! Está usando a instância da master do github?

Em caso afirmativo, temos agora um arquivo .env.example na nova release. Antes de utilizar o comando:

$ sudo docker-compose build

Executar:

cp .env.example .env

Espero que ajude! :smiley:

1 curtida

$ sudo docker-compose run --rm app bundle exec rake db:setup

ao executar o comando acima, recebi o seguinte retorno…

ERROR: Network fayeopenredu_default declared as external, but could not be found. Please create the network manually using docker network create fayeopenredu_default and try again.

ao rodar o comando

$ sudo docker-compose up

fica rodando sempre esse resultado e não consigo ver a página localhost:3000

delayedjob_1 | rake aborted!
delayedjob_1 | undefined method +' for nil:NilClass delayedjob_1 | /rails_app/config/application.rb:238:inclass:Application
delayedjob_1 | /rails_app/config/application.rb:15:in <module:Redu>' delayedjob_1 | /rails_app/config/application.rb:14:in<top (required)>’
delayedjob_1 | /rails_app/Rakefile:5:in require' delayedjob_1 | /rails_app/Rakefile:5:in<top (required)>’
delayedjob_1 | (See full trace by running task with --trace)
app_1 | rake aborted!
app_1 | undefined method +' for nil:NilClass app_1 | /rails_app/config/application.rb:238:inclass:Application
app_1 | /rails_app/config/application.rb:15:in <module:Redu>' app_1 | /rails_app/config/application.rb:14:in<top (required)>’
app_1 | /rails_app/Rakefile:5:in require' app_1 | /rails_app/Rakefile:5:in<top (required)>’
app_1 | (See full trace by running task with --trace)
openredu_app_1 exited with code 1
openredu_delayedjob_1 exited with code 1

Resolvido, era necessário criar não só a rede “fayeopenredu_default”, mas também a rede do vis e do livredoc…

docker network create vis_default
docker network create livredoc_default
docker network create fayeopenredu_default

falta o segundo problema, se alguém puder me ajudar…

2 curtidas

Fala Amarildo!

Acho que a bronca é nessa linha da nossa configuração: https://github.com/Openredu/Openredu/blob/27335a61405f5b064a8c78820ccc8f718ec52a4d/config/application.rb#L238

O que provavelmente tá acontecendo é que vc tá sem um arquivo de config que seta as variáveis de ambiente e esse ENV['VIS_HOST'] tá sendo avaliado como nil (nulo), que não dá pra concatenar (+) com o path que é o segundo argumento da operação.

Tenta copiar o arquivo de exemplo aí assim:

$ cp .env.example .env.development

e tenta rodar de novo, por favor.

1 curtida

Salve comunidade!

Recentemente reproduzi o tutorial e não foi possível concluir o processo, reportei na issue:

Analisando o ocorrido notei que o arquivo de configuração do docker faz referencia a um package que não existe mais, atualizei o arquivo e criei uma PR com a correção:

3 curtidas

Muito bom a postagem!