LoginSignup
9
12

More than 5 years have passed since last update.

Rails+SQL Server環境をDocker Composeで構築する

Posted at

本番環境にMicrosoftのPaaSであるAzure SQL Databaseを使っているサービスを想定し、その開発環境をDocker版SQL Serverを使って構築します。

Docker版SQL ServerもMicrosoftが公式に提供しています。良い時代になりました。

前提条件

Docker Client
Windows Subsystem for Linux (Ubuntu 16.04.3) 17.12.0-ce
Docker Server
Docker for Windows 17.09.1-ce

RailsをDocker化

まず前提として Docker公式のRails構築クイックスタートなどを参考に、Railsのアプリケーション部分をDockerにしておきます。
(db部分は書き換えるのでSQLiteのままでも構いません)

参考としてDockerfileを掲載します。

FROM ruby:2.3.0

ENV APP_ROOT=/myapp \
    BUNDLE_PATH=/bundle

WORKDIR $APP_ROOT

RUN apt-get update && \
    apt-get install -y nodejs \
                       sqlite3 \
                       freetds-dev \
                       --no-install-recommends && \
    rm -rf /var/lib/apt/lists/*

COPY Gemfile $APP_ROOT
COPY Gemfile.lock $APP_ROOT

RUN \
  echo 'gem: --no-document' >> ~/.gemrc && \
  cp ~/.gemrc /etc/gemrc && \
  chmod uog+r /etc/gemrc && \
  bundle config --global build.nokogiri --use-system-libraries && \
  bundle config --global jobs 4 && \
  bundle install

COPY . $APP_ROOT

EXPOSE  3000

必ずしもこの通りである必要はありませんが、SQL Serverに接続するには$ apt-get install freetds-devが必要になるので注意します。

Docker版SQL Serverの導入

必要になるGemを導入します。

Gemfile
# Azure SQL Server
gem 'tiny_tds', '~> 1.0'
gem 'activerecord-sqlserver-adapter'

次にdocker-compose.ymlを記述します。

このときvolumesを使ってデータを永続化しておきます。
なお同様の方法でbundleディレクトリも永続化することで、bundle installの度にbuildしなくても済むようにしています。
参考: docker-composeでRailsのGemを更新する時、docker buildするのを回避したい - Qiita

docker-compose.yml
version: '3'
services:
  db:
    image: microsoft/mssql-server-linux:2017-latest
    environment:
      ACCEPT_EULA: Y
      MSSQL_SA_PASSWORD: YourStrong!Passw0rd # ※のちに再設定するパスワード
    volumes:
      - db-volume:/var/opt/mssql/
    ports:
      - "1433:1433"
  app:
    build: .
    command: bundle exec rails server -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp # ※Windows Subsystem for LinuxのDocker Clientは相対パスがうまく動かない事があるので、必要ならば絶対パスに書き換える
      - bundle-volume:/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true
    environment:
      RAILS_ENV: development
volumes:
  bundle-volume:
    driver: local
  db-volume:
    driver: local

database.ymlも、Dockerで構築したSQL Serverを見に行くよう書き換えます。

database.yml
development:
  adapter: sqlserver
  host: db
  port: 1433
  dataserver: ""
  database: your_app_development
  username: SA
  password: "YourNewStrong!Passw0rd" # 再設定した後のパスワード
  timeout: 10
#  azure:    true # DockerではなくAzure SQL Databaseに接続する場合は必要

一度$ docker-compose upで起動した後、Microsoft公式ドキュメントの手順に従ってコンテナの内部のSQL Serverに接続し、パスワードを変更しておきます。

$ docker-compose build
$ docker-compose up
$ docker-compose exec db /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P '<YourStrong!Passw0rd>' \
   -Q 'ALTER LOGIN SA WITH PASSWORD="<YourNewStrong!Passw0rd>"'

あとは、この接続情報を使ってデータベーススキーマを適用し、アプリケーションを起動するだけです。

$ docker-compose run --rm app bundle install
$ docker-compose run --rm app bundle exec rake db:create
$ docker-compose run --rm app bundle exec rake db:migrate

SQL Serverのデバッグ

SQL Serverへの接続のクライアントにはVisual Studio Codeのmssql拡張機能を使うと便利です。

VSCodeを起動し、コマンドパレットで>Install Extensionsからmssql拡張機能をインストールします。
再読み込みし、>MS SQL: Connectを実行するか、設定ファイルに下記を記述することで接続情報を設定します。

settings.json
  "mssql.connections": [
    {
      "server": "localhost",
      "database": "your_app_development",
      "authenticationType": "SqlLogin",
      "user": "SA",
      "password": "",
      "emptyPasswordInput": false,
      "savePassword": true,
      "profileName": "localhost sql server"
    }
  ]
}

下記のようなファイルを作ってCtrl+Shift+E>MS SQL: Execute Queryすると、SQLが実行されます。

ms.sql
SELECT Name from sys.Databases
GO

詳細はMicrosoft公式ドキュメントを読んでください。

参考文献

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12