Dockerでrails s

#250: blog/Dockerでrails new 出来たので今回は、rails sしたくていろいろ調べながら、最低限のDockerfiledocker-comose.ymlが出来上がったのでメモ。

Dockerfile-dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
FROM ruby:2.4.2-slim
MAINTAINER Naoto Koshikawa <koshikawa@ppworks.jp>

ENV DEBIAN_FRONTEND noninteractive

# set locale and timezone
RUN apt-get update -qq && \
apt-get -y upgrade && \
apt-get -y install locales && \
apt-get clean && \
apt-get autoclean && \
apt-get autoremove && \
echo en_US.UTF-8 UTF-8 > /etc/locale.gen && locale-gen && dpkg-reconfigure locales && \
echo "Asia/Tokyo" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata

ENV TZ Asia/Tokyo

RUN apt-get -y --no-install-recommends install \
build-essential \
libpq-dev \
nodejs \
wget

ENV ENTRYKIT_VERSION 0.4.0
RUN wget https://github.com/progrium/entrykit/releases/download/v${ENTRYKIT_VERSION}/entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
&& tar -xvzf entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
&& rm entrykit_${ENTRYKIT_VERSION}_Linux_x86_64.tgz \
&& mv entrykit /bin/entrykit \
&& chmod +x /bin/entrykit \
&& entrykit --symlink

RUN mkdir /app
WORKDIR /app

ENTRYPOINT [ \
"prehook", "bundle install -j4 --quiet", "--"]

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: '3'
services:
rails: &app_base
build:
context: .
dockerfile: Dockerfile-dev
environment:
DATABASE_URL: "postgres://postgres:@db:5432/your_app_development"
volumes:
- ".:/app"
ports:
- "3000:3000"
depends_on:
- db
command: ["bundle", "exec", "rails", "s", "-b", "0.0.0.0"]
db:
image: "postgres:10.0"
volumes:
- pg-data:/var/lib/postgresql/data
volumes:
pg-data:
driver: local

.dockerignore

1
2
3
4
5
6
7
.git
doc
docker-compose.yml
log
tmp
Dockerfile
Dockerfile-dev

config/database.yml

雑に環境変数DATABASE_URLで繋ぐようにしてみた。

1
2
3
4
5
6
7
8
9
10
11
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
url: <%= ENV['DATABASE_URL'] %>
development:
<<: *default
test:
<<: *default
production:
<<: *default

使い方

Dockerfileを更新した場合は

1
2
docker-compose build
docker image prune # 必要に応じて

普段の開発は

1
docker-compose up -d

migrationなどの実行

1
docker-compose exec rails db:migate

DBに入る

1
docker-compose db psql -u postgres

みたいな感じ。

参考にした

この辺のQiita記事を参考にしつつも、そもそもDockerfileの記述方法もよくわからないし、docker-compose.ymlの記述方法もよくわからなかったので、公式ドキュメントを読みまくった。

buildしまくっていると、imageの差分が出来まくるので、不要なものを消したいと思って色々調べた結果

Dockerの不要なコンテナ・イメージを一括削除する方法

がとても参考になった。

1
docker image prune

をよく使う。

次はいまConoHa VPSで雑に動かしているアプリをDocker化してみようと思う。
本番も、docker-compose使うことになるのかな。だとしたら、今回作った開発用のものはdocker-compose-dev.ymlみたいな感じになるだろうか。試行錯誤してみよ。