Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

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:

便利

ntk1000
子育てエンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away