Guida: preparare un ambiente di sviluppo Ruby On Rails su Windows 10 tramite Docker

Viste le non poche difficoltà che ho avuto nel preparare un ambiente di sviluppo per una applicazione scritta con Ruby On Rails da una macchina Windows 10 sfruttando Docker, ho deciso di preparare questa guida sperando di far risparmiare un po' di tempo a qualche interessato ;)

L'idea è quella di sviluppare l'applicazione scrivendo il codice direttamente sul filesystem della macchina Windows 10. Volevo però avere avere l'application server in container in modo da poter sfruttare tutte le potenzialità di Ruby e sopratutto di Rails. Inoltre volevo che l'applicazione si appoggiasse su un database MySql anch'esso in un container Docker.

Come prima cosa bisogna installare Docker per Windows, il software è reperibile nel sito ufficiale di Docker, in particolare bisogna installare "Docker for Windows versione Stable".
Una volta scaricato bisognerà installarlo, al termine dell'installazione verrà proposto questo messaggio:
Hyper-V feature is not enabled.
Do you want to enable it for Docker to be able to work properly?
Your computer will restart automatically.
Note: VirtualBox will no longer work.
In poche parole per poter usare i container su Windows è necessario abilitare l'Hyper-V, questo può essere un problema se si utilizzano altri software di virtualizzazione come VirtualBox o VMware, tuttavia possiamo tranquillamente attivarlo e poi disabilitarlo quando dovremo usare uno di quei software.

Se tutto è andato a buon fine potrete vedere la versione di Docker installata, nel mio caso la 1.12.1
C:\Users\marco.fracassi>docker -v
Docker version 1.12.1, build 23cf638
Ora dobbiamo creare la cartella che ospiterà i file dell'applicazione che nel mio caso si chiamerà swrap.
Nella nuova cartella dovremo creare il file vuoto Gemfile.lock e il file Gemfile contenente il minimo indispensabile per lanciare una installazione di Rails, ovvero le seguenti righe;
source 'https://rubygems.org'
gem 'rails', '4.2.0' 
Ci serve poi il file che serve per produrre l'immagine che ospiterà l'applicazione web. Creiamo quindi il file Dockerfile_web con questo contenuto:
FROM ruby:latest
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /swrap
WORKDIR /swrap
ADD Gemfile /swrap/Gemfile
ADD Gemfile.lock /swrap/Gemfile.lock
RUN bundle install
ADD . /swrap
Sempre nella nuova cartella creiamo il file che serve per orchestrare i vari container coinvolti nel setup dell'ambiente di sviluppo: il file docker-compose.yml. In questo file vengono descritti i servizi, come essi devono essere fatti partire e le loro dipendenze:
version: '2'
services:
  database:
    image: mysql/mysql-server:latest
    # environment:
      #- MYSQL_ROOT_PASSWORD: p4ssw0rd    
  web:
    build:
      context: .
      dockerfile: Dockerfile_web
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/swrap
    ports:
      - "3000:3000"
    depends_on:
      - database
Siamo quasi pronti per avviare il container web ma prima dobbiamo attivare nella configurazione di Docker lo share del disco C per poter condividere parte del volume con i container:

Ora possiamo avviare il container web lanciando la sua bash e mappando il volume che ospiterà il codice:
docker run -it -v C:/privata/devs/swrap/:/swrap swrap_web bash
quindi si può creare l'applicazione forzandola ad usare un database MySql:
rails new . --force --database=mysql --skip-bundle 
si può quindi chiudere la bash.
Avremo dentro C:/privata/devs/swrap/ tutti i file creati. Andiamo ad editare il Gemfile scommentando la gemma therubyracer.
Infine modifichiamo la configurazione del database per usare il nostro dbms MySql, agendo nel file config\database.yml:
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: root
  host: database
Una limitazione che non sono riuscito a superare è quella di usare l'utente root e la sua password di default root per connettere l'applicazione al database. Sembra che la versione Windows di docker-compose non si comporti bene con le variabili d'ambiente che infatti sono commentate nel docker-compose.yml che ho riportato in precedenza (sono benvenuti consigli su come superare questa limitazione).

Ebbene, è tutto pronto per avviare i container:
docker-compose up
possiamo quindi andare nel container web per creare il database, per collegarsi;
docker run -it -v C:/privata/devs/swrap/:/swrap swrap_web bash 
e una volta nella bash creiamo il database con:
rake db:create 
se dalla macchina Windows apriamo la url http://localhost:3000/  dovremmo vedere il risultato di cotanti sforzi:
Spero di essere stato utile e di non aver dimenticato qualche passaggio.
Il setup sembra ancora un po' macchinoso su Windows e le limitazioni che ho trovato rispetto ad un analogo setup sotto Linux non sono poche, spero che Docker rilasci a breve nuovi sviluppi.

Comments

Popular posts from this blog

"Back to values" agile retrospective format

Contracts: diagonal saber vs. agile

ScuolaXP 2017 - Com'è andata?