使用 Rail

我們現在將使用 Compose 設定並執行一個 Rails/PostgreSQL 應用。在開始之前,先確保 Compose 已經 安裝

在一切工作開始前,需要先設定好三個必要的檔案。
首先,因為應用將要執行在一個滿足所有環境依賴的 Docker 容器裡面,那麼我們可以透過編輯 Dockerfile 檔案來指定 Docker 容器要安裝內容。內容如下:

FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp

以上內容指定應用將使用安裝了 Ruby、Bundler 以及其依賴件的映像檔。更多關於如何編輯 Dockerfile 檔案的資訊可以 檢視 映像檔建立Dockerfile 使用。 下一步,我們需要一個引導載入 Rails 的檔案 Gemfile 。 等一會兒它還會被 rails new 指令覆寫重寫。

source 'https://rubygems.org'
gem 'rails', '4.0.2'

最後,docker-compose.yml 檔案才是最神奇的地方。 docker-compose.yml 檔案將把所有的東西關聯起來。它描述了應用的構成(一個 web 服務和一個資料庫)、每個映像檔的來源(資料庫執行在使用預定義的 PostgreSQL 映像檔,web 應用側將從本地目錄建立)、映像檔之間的連線,以及服務開放的連接埠。

db:
  image: postgres
  ports:
    - "5432"
web:
  build: .
  command: bundle exec rackup -p 3000
  volumes:
    - .:/myapp
  ports:
    - "3000:3000"
  links:
    - db

所有檔案就緒後,我們就可以透過使用 docker-compose run 指令產生應用的骨架了。

$ docker-compose run web rails new . --force --database=postgresql --skip-bundle

Compose 會先使用 Dockerfile 為 web 服務建立一個映像檔,接著使用這個映像檔在容器裡執行 rails new 和它之後的指令。一旦這個指令執行完後,應該就可以看一個嶄新的應用已經產生了。

$ ls
Dockerfile   app          docker-compose.yml      tmp
Gemfile      bin          lib          vendor
Gemfile.lock condocker-compose       log
README.rdoc  condocker-compose.ru    public
Rakefile     db           test

在新的 Gemfile 檔案去掉載入 therubyracer 的行的註釋,這樣我們便可以使用 Javascript 執行環境:

gem 'therubyracer', platforms: :ruby

現在我們已經有一個新的 Gemfile 檔案,需要再重新建立映像檔。(這個會步驟會改變 Dockerfile 檔案本身,僅僅需要重建一次)。

$ docker-compose build

應用現在就可以啟動了,但設定還未完成。Rails 預設讀取的資料庫目標是 localhost ,我們需要手動指定容器的 db 。同樣的,還需要把使用者名稱修改成和 postgres 映像檔預定的一致。 開啟最新產生的 database.yml 檔案。用以下內容取代:

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: myapp_test

現在就可以啟動應用了。

$ docker-compose up

如果一切正常,你應該可以看到 PostgreSQL 的輸出,幾秒後可以看到這樣的重複資訊:

myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick 1.3.1
myapp_web_1 | [2014-01-17 17:16:29] INFO  ruby 2.0.0 (2013-11-22) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

最後, 我們需要做的是建立資料庫,開啟另一個終端機,執行:

$ docker-compose run web rake db:create

這個 web 應用已經開始在你的 docker 守護處理序裡面監聽著 3000 連接埠了(如果你有使用 boot2docker ,執行 boot2docker ip ,就會看到它的位址)。

results matching ""

    No results matching ""