はじめに
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:
便利