読者です 読者をやめる 読者になる 読者になる

時と場合によりけり

日々のアップデートとイノベーションに翻弄され彷徨える IT エンジニアの覚書

Docker for Mac で Alpine ベースの軽量な Rails の開発環境を構築してみる

概要

CentOSUbuntu よりも軽量な Alipine を使って、Rails の開発環境を Docker for Mac で作成してみます。

Docker for Mac のインストールについては、以下のエントリーをご参照ください。

stangler.hatenablog.com

ハードウェア

  • マシン: Macbook Pro Early 2011
  • メモリ: 16 GB
  • ストレージ: SSD 512 GB

ホスト

  • OS: macOS 10.12.1 Sierra
  • Docker for Mac Version 1.12.3

ゲスト

Ruby イメージの比較

DockerHub に公式イメージがあるので、Ubuntu と Alpine の Ruby イメージをダウンロードして比較してみます。

https://hub.docker.com/_/ruby/

まずは、Ubuntu

% docker pull ruby:2.3.2

次に、Alpine

% docker pull ruby:2.3.2-alpine

比べてみると

% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ruby                2.3.2-alpine        f67322bbee5a        8 weeks ago         126.9 MB
ruby                2.3.2               d0f948bdaa95        8 weeks ago         730.1 MB

Alpine が 126.9 MB 、Ubuntu が 730.1 MB 。
Alpine の方が、かなり軽いですね。

作業ディレクトリ作成

名前は任意です。ここでは、hatena01 というディレクトリ名にします。

% mkdir hatena01

MySQL のデータ永続化のため、busybox 用のディレクトリも作っておきます。

% mkdir -p hatena01/datastore-hatena01

Dockerfile

参考 URL

Dockerでruby/alpineを使ってrails+mysql+redisの環境作成 - Qiita

Dockerfile 作成

% vim Dockerfile
FROM ruby:2.3.2-alpine

ENV LANG ja_JP.UTF-8

RUN apk update && \
    apk upgrade && \
    apk add --update\
    bash \
    build-base \
    curl-dev \
    git \
    libxml2-dev \
    libxslt-dev \
    linux-headers \
    mysql-dev \
    nodejs \
    openssh \
    ruby-dev \
    ruby-json \
    tzdata \
    yaml \
    yaml-dev \
    zlib-dev

##### Rails #####
RUN gem install bundler

WORKDIR /tmp
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install

ENV APP_HOME /myapp
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
COPY . $APP_HOME

Gemfile

Gemfile 作成

vim Gemfile
source 'https://rubygems.org'
gem 'rails'

Gemfile.lock 作成

% touch Gemfile.lock

Docker Compose

docker-compose.yml 作成

% vim docker-compose.yml
version: '2'
services:
  web-hatena01:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db-hatena01
    container_name: web-hatena01

  db-hatena01:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root_password
    volumes_from:
      - datastore-hatena01
    container_name: db-hatena01

  datastore-hatena01:
    image: busybox
    volumes:
      - ./datastore-hatena01:/var/lib/mysql
    container_name: datastore-hatena01

Rails アプリケーション生成

% docker-compose run web-hatena01 rails new . --force --database=mysql --skip-bundle

JavaScript runtime 用に therubyracer の gem インストールを有効化

参考 URL

ruby - therubyracer - Gem::Ext::BuildError: ERROR: Failed to build gem native extension - Stack Overflow

Gemfile に追加

以下を追加します。

+ gem 'therubyracer', '0.11.3'
+ gem 'libv8', '3.11.8.13'

完成形は以下となります。

% cat Gemfile
source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end


gem 'rails', '~> 5.0.1'
gem 'mysql2', '>= 0.3.18', '< 0.5'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'

gem 'therubyracer', '0.11.3'
gem 'libv8', '3.11.8.13'

gem 'jquery-rails'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'


group :development, :test do
  gem 'byebug', platform: :mri
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '~> 3.0.5'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

ビルド

% docker-compose build

データベース

config/database.yml の設定

% vim config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: root_password
  host: db-hatena01

development:
  <<: *default
  database: hatena01_development

test:
  <<: *default
  database: hatena01_test

Docker コンテナ実行

% docker-compose up

DB 作成

ターミナルの別タブを開く

% docker-compose exec web-hatena01 rails db:create
Created database 'hatena01_development'
Created database 'hatena01_test'

動作確認

ブラウザで確認

http://localhost:3000 もしくは http://0.0.0.0:3000

f:id:stangler:20170117150243p:plain

Rails「Cannot render console from Allowed networks」と言われたら

参考 URL

Rails「Cannot render console from Allowed networks」と言われたら - Qiita

development.rb

以下を追加。

% vim config/environments/development.rb
  config.web_console.whitelisted_ips = '0.0.0.0/0'

停止

docker-compose up したターミナルのタブで Ctl + c を実行。 または、別タブで以下を実行。

% docker-compose stop

再起動

まずは、古いプロセス削除しておく。

% rm -rf tmp/pids/server.pid

そして up する。

% docker-compose up

以上です。

謎の AMAZON DOWNLOADS 請求

以下に引っ越しました。

stangler.blogspot.jp

macOS Sierra の AppStore で中断したアップデートが再開しないときの解決法

概要

AppStore でアップデート中に強制終了して、アップデート再開ボタンを押しても、うんともすんともいわなくなったときは、キャッシュをクリアしましょうという話です。

ホスト

経緯

Xcode 8.2.1 のアップデート通知が来たので、アップデートボタンを押したのですが、あまりにファイルサイズが大きかったので、一時的に中断することにしました。中断処理も時間がかかり、なかなか進みません。急いでいたので、AppStore を強制終了。翌日、再度、アップデート作業に取り掛かろうと、アップデート再開ボタンを押しましたが、動かなくなってしまいました。

解決法

El Capitan の場合は、AppStore にデバッグメニューがあったらしく、それを使ってキャッシュをクリアすればよかったみたいです。

http://spotry.me/2015/how-to-resume-mac-os-x-el-capitan-download/

しかし、Sierra の AppStore にはそのデバッグメニューがありませんでした。

さらに調べたところ、以下が検索で引っかかりました。

apple.stackexchange.com

ターミナルで以下のコマンドを打って、表示されたフォルダの中を削除すれば、AppStore のキャッシュがクリアできるとのことです。

open `getconf DARWIN_USER_CACHE_DIR`/com.apple.appstore

キャッシュをクリアしたら、マシン自体も再起動しましょう。で、AppStore を立ち上げれば、該当するアプリのアップデートを最初から始めることができるようになります。