Rails 5.1 konfiguracja Dockera – part 2

Gdzie umieścić pliki dockera?

Najczęściej pliki zwiazane z konfiguracją umieszczamy w głównym katalogu aplikacji. Jednak w naszym przypadku nie bedzie to tylko jeden plik. Aby nie zaśmiecać głównego katalogu dodamy osobny folder, do którego wrzucimy wszystkie potrzebne pliki dockera. Najlepiej umieścić go w katalogu /config

app
config
  |docker
     -- Dockerfile
     -- docker-compose.yml
db
lib
public
...

Docker-compose dla rails_app

Docker-compose służy do tego aby łączyć ze sobą poszczególne obrazy dockera. W naszym przypadku użyjemy następujących obrazów:

  • Obraz główny bazujący na ruby:2.4.0
  • Obraz bazy danych – postgres:9.6.2
  • Obraz do trzymania gemów busybox (obraz z minimalna ilością zależności)
# config/docker/docker-compose.yml

version: '2'
services:
  db:
    image: postgres:9.6.2
  server:
    build:
      context: ../../
      dockerfile: ./config/docker/Dockerfile
    volumes:
      - ../../:/rails_app
    volumes_from:
      - gems
    ports:
      - '3000:3000'
      - '8080:8080'
    depends_on:
      - db
    tty: true
    stdin_open: true
  gems:
    image: busybox
    volumes:
      - /rails_app_gems

Objaśnienie

 server:
    build:
      context: ../../
      dockerfile: ./config/docker/Dockerfile

Ponieważ umieściliśmy docker-compose.yml w podkatalogu aplikacji, to trzeba wskazać gdzie znajdują się pliki aplikacji oraz gdzie jest dockerfile.

    ports:
      - '3000:3000'
      - '8080:8080'
    depends_on:
      - db

Polecenie ports sprawia ze porty ze ‘środka’ dockera są widoczne w naszej lokalnej maszynie. Polecenie depends_on robi tylko tyle, że wymusza stworzenie obrazu db, zanim stworzy się obraz server

    tty: true
    stdin_open: true

Dzięki tym poleceniom utworzy się container do którego będziemy mogli się zalogować

   volumes:
      - ../../:/rails_app

Pliki naszej aplikacji (../../) będą się znajdować w containerze w katalogu /rails_app

   volumes_from:
      - gems

Jesli nasze gemy trzymalibyśmy bezpośrednio w głównym obrazie to za każdym razem przy przebudowie obrazu wszystke gemy ściągałyby się od nowa. Z tego względu wykorzystujemy osobny obraz do trzymania danych. Polecenie volumes_form nam to umożliwia.

Dockerfile

FROM ruby:2.4.0

RUN apt-get update -qq
RUN apt-get install apt-transport-https

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash -
RUN apt-get update -qq

RUN apt-get install -y build-essential libpq-dev  yarn nodejs

WORKDIR /rails_app

ENV BUNDLE_PATH=/rails_app_gems
ENV RAILS_ENV=develop

FROM ruby:2.4.0

Bazujemy na obrazie ruby:2.4.0

RUN apt-get update -qq
RUN apt-get install apt-transport-https

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash -
RUN apt-get update -qq

RUN apt-get install -y build-essential libpq-dev  yarn nodejs

Powyższe linijki służą do zainstalowania nodejs, oraz yarn-a czyli managera pakietów js.

WORKDIR /rails_app

ENV BUNDLE_PATH=/rails_app_gems
ENV RAILS_ENV=develop

Workdir określa katolog w którym będą wykonywane wszystkie polecenia.
BUNDLE_PATH=/rails_app_gems powinna być zgodna ze ścieżką którą podaliśmy w docker-compose-yml
ENV RAILS_ENV=develop, dla uproszczenia jako środowisko podaje develop, chociaż osobiście preferuje dodanie odobnego env dla dockera, np docker-dev. Wiąże się to jednak z tym, że trzeba takie środowisklo skonfigurować w railsach.

Co dalej?

Środowisko mamy skonfigurowane. Możemy więc przystąpić do uruchomienia aplikacji, a nastepnie do pracy nad nią w środowisku dockera

W następnym poście napiszę jak to zrobić