LoginSignup
17
12

More than 5 years have passed since last update.

古いrailsアプリをdockerに封じ込める alpineで

Posted at

はじめに

Dockerfile晒す

FROM gliderlabs/alpine:latest

ENV BUILD_PACKAGES bash wget curl tar make gcc alpine-sdk zlib zlib-dev readline 
ENV GEM_PACKAGES openssl openssl-dev libxml2-dev libxslt-dev mysql mariadb-dev imagemagick imagemagick-dev imagemagick-c++ ruby-rmagick

RUN apk update && \
    apk upgrade && \
    apk --no-cache add tzdata \
    $BUILD_PACKAGES $GEM_PACKAGES && \
  cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
  apk del tzdata 

# build ruby
RUN wget -q -O ruby-1.8.7-p374.tar.gz http://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p374.tar.gz && \
    tar -zxvf ruby-1.8.7-p374.tar.gz && \
    rm ruby-1.8.7-p374.tar.gz

WORKDIR ruby-1.8.7-p374
RUN ./configure --with-openssl-dir=/usr/bin
RUN make
RUN make install

# install rubygems
WORKDIR /
RUN wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz && \
    tar -zxvf rubygems-1.3.7.tgz && \
    rm rubygems-1.3.7.tgz
WORKDIR rubygems-1.3.7
RUN ruby setup.rb

# install bundler
RUN gem install bundler

WORKDIR /app
COPY Gemfile /app/

# bundle install
RUN bundle install
COPY . /home/app

何がしたかったのか

古のrailsアプリの開発に関わることになったので、docker化できるか試してみたかった
(docker歴6ヶ月、ruby/rails歴0ヶ月)

環境

  • ruby 1.8.7
  • gem 1.3.7
  • rails 2.3.5

ポイント aka はまりポイント

  • rubyをソースからmakeするために必要だったパッケージは$BUILD_PACKAGESにまとめた
  • rubyを./configureするときに--with-openssl-dirオプションでopensslのディレクトリを指定しないと、"bundle install"するときに https://rubygems.org などhttpsサイトから取得できない
  • かといってGemfileのほうでhttpsをhttpにしてもinstallが進まないので解決にはならない
  • gem周りでインストール必要だったパッケージは$GEM_PACKAGESにまとめた("mysql"gemだったら mysql, mariadb-devとか、"rmagick"gem だったら imagemagickとimagemagick-devとか)
  • rmagick 2.13.1はimagemagickとimagemagick-dev入れてもinstall失敗するので2.13.2に上げた

TODO

  • このままだとroot実行になりセキュリティ的によろしくないのでadduserしてUSER指定したほうがよい
  • 今は特定のバージョンしか使っていないが、今後段階的にバージョンを上げる、等のケースを想定するとrvmやらrbenvなどバージョン切り替えられるイメージを作ったほうがよいのかも
  • その他passengerとかミドルウェア周りのコンテナは未対応

docker-compose

こんな感じでdocker-compose定義しておけば、これまでVMや開発用のDBサーバーに依存してた開発環境が全部ローカルで完結するようになった

docker-compose.yml
version: '2'
services:
    rails:
        build:
            context: /path/to/
            dockerfile: DockerfileName
        ports:
            - "3000:3000"
        depends_on:
            - db 
        networks:
            - app
            - datastore
    db:
        image: mysql:5.6
        ports:
            - "3306:3306"
        environment:
            - TZ=JST-9
            - MYSQL_USER=required
            - MYSQL_PASSWORD=required
            - MYSQL_ROOT_PASSWORD=required
            - MYSQL_DATABASE=required
        volumes:
            - /path/to/mysql/dump/:/docker-entrypoint-initdb.d/
            - /path/to/mysql/conf/:/etc/mysql/conf.d
        privileged: true
        networks:
            - datastore
networks:
    app:
    datastore:

便利

17
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
17
12