railsアプリのDocker化


既存のRailsアプリケーションをDocker化する道のりです


## rails appをひとまずビルドしてみる

https://docs.docker.jp/get-started/toc.html

まずはこちらのチュートリアルに習い、Dockerファイルを作成、起動ができるかを試してみました。

https://docs.docker.jp/compose/rails.html

このチュートリアルでも、Railsの起動を取り扱っているので、DockerFileはこちらを真似て作成。

```Dockerfile
FROM ruby:3.2.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

```apt-get update -qq```（なんの）アップデート可能な一覧を表示

```apt-get install (引数)```引数のパッケージをインストールする
```-y```	インタラクティブ（ユーザーへの問い合わせ）に「yes」と答えます。（文言変える）
https://webkaru.net/linux/apt-get-command/

* build-essential
* libpq-dev
* nodejs
それぞれ必要なやつ

こちらを

```docker run -dp 127.0.0.1:3000:3000 getting-started```
うまくビルドできた！
local3000にアクセスしてみると、「データベースがない:rage:」と怒られますが、
エラーメッセージは出るので起動はしていそう。

## compose upしてみる

https://docs.docker.jp/compose/rails.html

今度はデータベースも起動するために
またまたこちらのチュートリアルに習って、ymlファイルを作成して、Compose up まで行う

```docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    environment:
      POSTGRES_HOST_AUTH_METHOD: 'trust' 
    volumes:
        - ./postgres/data:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
volumes:
  postgres_data:
```


```POSTGRES_HOST_AUTH_METHOD: 'trust' ```
本来はちゃんとパスワードを設定した方がよいとのことです

参考記事

https://qiita.com/tomopict/items/23cc4332781bb28d2973

ymlファイルを作成したら、
```docker compose-up```

初回のみデータベースをCreateしたあと、Migrationする必要があります
別でターミナルを起動して、

```docker-compose run web rake db:create```

Createしただけだと「Migrateされてない！」と怒られるので、Migrateもする
```docker-compose run web rake db:migrate```

ローカルホストにアクセス
http://localhost:3000/

![スクリーンショット 2023-10-24 23.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491087/98fe0927-c8bd-8f00-1a7c-deb28e828d0a.png)

できた！

```docker-compose　down```で停止しないと、
次回の起動時に「server.pidが既にあるよ！」と怒られるので、
そのときはローカルの該当ファイルを削除してみてください。

## 軽量化してみる

```docker images```でImageのサイズが確認できる！
みてみたところ、今回のイメージが1.16GBも使っていたので、軽量化にもチャレンジしてみました

### 試したこと

#### 1\. Dockerファイルを見直す
* RUNが続いていた場合は、```＆＆```で繋げる
* ```mkdir```のあとに```WORKDIR```してる場合は、```WORKDIR```のみにする
    * ディレクトリが存在しない場合は、自動的に作成してくれます！
* 不要な```ADD```をしていないかみてみる

これらをやってみたところ、
1.25GBに！増えてる！！！:rage:

#### 2\. ベースイメージを変える
他に軽量化するとしたら、ベースイメージを変えるしかない？と思っていたら、
alpineという軽いベースイメージがあるらしい！ということで、
これでBuildを試してみました

DockerFileの一行目を
```FROM ruby:3.2.2-alpine3.18```
に変更して、そのままビルドしたところ、
「apt-getなどない」
「build-essentialなどない」
```
0.911 ERROR: unable to select packages:
0.911   build-essential (no such package):
0.911     required by: world[build-essential]
```
「tzinfo-dataがない、インストールしろ」
```
`rescue in create_default_data_source': tzinfo-data is not present.
Please add gem 'tzinfo-data' to your Gemfile and
run bundle install (TZInfo::DataSourceNotFound)
```

などの文句を言われ、泣きながらDockerファイルを修正した結果、



```Dockerfile
FROM ruby:3.2.2-alpine3.18
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN apk update && \
    apk upgrade  && \
    apk add --no-cache alpine-sdk libpq-dev nodejs tzdata && \
    bundle install
```

こちらのファイルでBuildして動くようになりました！

```apk add``` ・・・```apt-get```の代わり
```alpine-sdk```　・・・build-essentialの代わりのようです

Imageサイズも469MBに:v:
ただ、実行しているアプリの立ち上げや遷移の動きが若干鈍くなったような気がします。
重くてもいいなら、ベースイメージはそのままの方が良いかなと思いました

##### 軽量化で参考にしたページ

build-essentialがないと言われた時

https://github.com/gliderlabs/docker-alpine/issues/24


https://qiita.com/KIMSeongJoo/items/d7a1c08ff85fcbc94340

https://techtechmedia.com/alpine-docker/

https://qiita.com/rh_taro/items/e2b4a0da4b7975921ff7