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ć