快速入门: Compose和Rails

本快速入门指南介绍如何使用docker compose配置和运行一个Rails/PostgreSQL app。

定义项目

定义用来构建app的三个文件。首先由于app是运行在包含它的所有依赖的容器内,你需要定义哪些文件需要包括在容器内。这个可以使用Dockerfile来完成。这个Dockerfile包括:

  1. FROM ruby:2.3.3
  2. RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
  3. RUN mkdir /myapp
  4. WORKDIR /myapp
  5. ADD Gemfile /myapp/Gemfile
  6. ADD Gemfile.lock /myapp/Gemfile.lock
  7. RUN bundle install
  8. ADD . /myapp

上面把应用程序代码放到了镜像内,这个镜像将用来运行一个包含Ruby,Bundler和其所有的依赖的容器。

下一步,创建一个只加载Rails的bootstrap Gemfile文件。在后面将由rails new覆盖它。

  1. source 'https://rubygems.org'
  2. gem 'rails', '5.0.0.1'

需要一个空的Gemfile.lock文件,构建Dockerfile用到。

  1. touch Gemfile.lock

最后,开始创建docker-compose.yml文件。这个文件描述了你的app由什么服务构建(数据库和web app),如何获取每一个的镜像以及需要链接它们到一起和暴露web app的端口的配置。

  1. version: '2'
  2. services:
  3.   db:
  4.     image: postgres
  5.   web:
  6.     build: .
  7.     command: bundle exec rails s -p 3000 -b '0.0.0.0'
  8.     volumes:
  9.       - .:/myapp
  10.     ports:
  11.       - "3000:3000"
  12.     depends_on:
  13.       - db

构建项目

准备好那三个文件后,就可以使用docker-compose run来生成Rails skeleton app了:

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

首先,compose使用Dockerfile构建web服务的镜像。然后使用那个镜像生成容器,在容器内运行rails new命令。一旦完成,将生成一个全新的app:

  1. $ ls -l
  2.   total 56
  3.   -rw-r--r--   1 user  staff   215 Feb 13 23:33 Dockerfile
  4.   -rw-r--r--   1 user  staff  1480 Feb 13 23:43 Gemfile
  5.   -rw-r--r--   1 user  staff  2535 Feb 13 23:43 Gemfile.lock
  6.   -rw-r--r--   1 root  root   478 Feb 13 23:43 README.rdoc
  7.   -rw-r--r--   1 root  root   249 Feb 13 23:43 Rakefile
  8.   drwxr-xr-x   8 root  root   272 Feb 13 23:43 app
  9.   drwxr-xr-x   6 root  root   204 Feb 13 23:43 bin
  10.   drwxr-xr-x  11 root  root   374 Feb 13 23:43 config
  11.   -rw-r--r--   1 root  root   153 Feb 13 23:43 config.ru
  12.   drwxr-xr-x   3 root  root   102 Feb 13 23:43 db
  13.   -rw-r--r--   1 user  staff   161 Feb 13 23:35 docker-compose.yml
  14.   drwxr-xr-x   4 root  root   136 Feb 13 23:43 lib
  15.   drwxr-xr-x   3 root  root   102 Feb 13 23:43 log
  16.   drwxr-xr-x   7 root  root   238 Feb 13 23:43 public
  17.   drwxr-xr-x   9 root  root   306 Feb 13 23:43 test
  18.   drwxr-xr-x   3 root  root   102 Feb 13 23:43 tmp
  19.   drwxr-xr-x   3 root  root   102 Feb 13 23:43 vendor

如果这个时候或之后编辑了Gemfile,需要重新构建镜像。

  1. docker-compose build

连接数据库

使用如何内容替换config/database.yml文件:

  1. development: &default
  2.   adapter: postgresql
  3.   encoding: unicode
  4.   database: myapp_development
  5.   pool: 5
  6.   username: postgres
  7.   password:
  8.   host: db
  9.  
  10. test:
  11.   <<: *default
  12.   database: myapp_test

开始启动app:

  1. docker-compose up

如果一切正常,将会看到PostgrepSQL的输出,然后再过几秒钟,将看到

  1. myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick 1.3.1
  2. myapp_web_1 | [2014-01-17 17:16:29] INFO  ruby 2.2.0 (2014-12-25) [x86_64-linux-gnu]
  3. myapp_web_1 | [2014-01-17 17:16:29] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

最后,在另一个终端创建一个数据库:

  1. docker-compose run web rails db:create

现在app已经运行在主机的3000端口。

发布于:2019-11-19 04:06:20